• POJ 1456 Supermarket【贪心 + 并查集】


    题意:给你 N 件不同的商品,每件商品最多可以买一次。

          每件物品对应两个值 pi   di

          pi 表示物品的价值,di 表示可以买的最迟时间(也就是第一天到第 di 天都可以买这件物品)

          规定:每天最多可以买一件物品,问你可以得到的最大价值。


    算法:贪心

          看了KB神的题解,他用的并查集,等下贴个代码。


    思路【贪心版本】:将物品按照价值从大到小排序

                      依次枚举每件物品

                      从可以买的最后一天枚举,看是否可以买

                      注意标记天数


    思路KB的并查集版本】:将物品按照价值从大到小排序

                            处理的时候选择最后的一个不冲突点。


                            用并查集实现链表的作用,快速找到不冲突点。

    贪心版本

    K Accepted 220 KB 141 ms C++ 857 B 2013-04-10 22:03:47

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 10000+10;
    
    bool used[maxn]; //标记天数是否可以买
    struct Node
    {
        int pi;
        int di;
    }node[maxn];
    
    bool cmp(Node a, Node b)
    {
         return a.pi > b.pi; //按照价值从大到小排序
    }
    
    int main()
    {
        int n;
        while(scanf("%d", &n) != EOF)
        {
            memset(used, false, sizeof(used));
            for(int i = 1; i <= n; i++)
            {
                scanf("%d%d", &node[i].pi, &node[i].di);
            }
    
            sort(node+1, node+n+1, cmp);
    
            int ans = 0;
    
            for(int i = 1; i <= n; i++) //枚举每一件物品
            {
                for(int j = node[i].di; j >= 1; j--) //从后往前枚举每一天
                {
                    if(!used[j]) //一旦找到这天可以买
                    {
                        ans += node[i].pi;
                        used[j] = true; //标记这一天已经用了
                        break; //跳出最近的 for() 进入下一件物品
                    }
                }
            }
            printf("%d\n", ans);
        }
        return 0;
    }

    并查集+贪心版本【转】 时间减少一半

    K Accepted 296 KB 79 ms C++ 974 B 2013-04-14 12:40:37
    /*
    POJ 1456
    贪心处理。
    按照获利p从大到小排序。
    处理的时候选择最后的一个不冲突点。
    
    用并查集实现链表的作用,快速找到不冲突点
    */
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN=10010;
    int F[MAXN];
    struct Node
    {
        int p,d;
    }node[MAXN];
    bool cmp(Node a,Node b)//按p从大到小排序。d没有关系
    {
        return a.p>b.p;
    }
    int find(int x)
    {
        if(F[x]==-1)return x;
        return F[x]=find(F[x]);
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)==1)
        {
            memset(F,-1,sizeof(F));
            for(int i=0;i<n;i++)
              scanf("%d%d",&node[i].p,&node[i].d);
            sort(node,node+n,cmp);
            int ans=0;
            for(int i=0;i<n;i++)
            {
                int t=find(node[i].d);
                if(t>0)
                {
                    ans+=node[i].p;
                    F[t]=t-1;
                }
            }
            printf("%d\n",ans);
        }
        return 0;
    }



  • 相关阅读:
    c
    罗扎诺夫高效记忆音乐【推荐试试】
    通过信息系统项目管理师最高可申领补贴2000元
    人事考试网【您有新信息】浙江人事考试网_浙江省公务员考试网_2017浙江公务员考试_中公浙江
    几种需求管理工具(转)_伊处_新浪博客
    PLM_百度百科
    统御软件 (oKit)| 项目管理软件,项目管理咨询,项目需求管理工具,集成研发管理平台 ——管理咨询与实施工具 一站式项目管理解决方案
    Oracle PLM
    Oracle PLM
    Oracle PLM
  • 原文地址:https://www.cnblogs.com/freezhan/p/3219075.html
Copyright © 2020-2023  润新知