[poj 1456]Supermarket{贪心+并查集}

题目

http://poj.org/problem?id=1456


解题思路

我们可以用并查集维护一个数组中“位置”的占用情况。每个“位置”所在集合的代表就是从它开始往前数第一个空闲的位置(包括它的本身)。当一个“位置”被占用时(某一天安排了商品),就把该“位置”在并查集中指向它前一个“位置”。利用并查集的路径压缩,就可以快速找到最晚能卖出的时间(从过期时间往前数第一个空闲的天数)。


代码

#include
#include
using namespace std; 
struct node{int x,y;}a[20001];
int n,f[10002]; 
bool cmp(node x,node y){return x.x>y.x;}
int findd(int k) {return f[k]==k?k:f[k]=findd(f[k]);}
int main()
{
    while (~scanf("%d",&n)){
        for (int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); 
        sort(a+1,a+n+1,cmp); int ans=0;
        for (int i=1;i<=10000;i++) f[i]=i;
        for (int i=1;i<=n;i++)
         if ((a[i].y=findd(a[i].y))>0) f[a[i].y]=a[i].y-1,ans+=a[i].x; 
        printf("%d\n",ans); 
    }
}

你可能感兴趣的:(并查集,贪心算法)