【并查集变形】UVA1316 或 POJ 1456 Supermarkdet

链接

http://blog.csdn.net/phphot/article/details/2187505

大意

给定 n n 个商品的价值和它们的过期时间,一天只能卖一件,且不卖过期的,问最多能卖多少钱?

思路

先贪心的排个序,然后一个一个选,用并查集判断时间是否还够即可

代码

#include
#include
#include
#define N 10001
using namespace std;
int n,f[N],ans;
struct work{int d,p;}a[N];
inline bool cmp(register work x,register work y){return x.p>y.p;}
inline int find(register int x){if(f[x]==-1) return x;return f[x]=find(f[x]);}//路径压缩
signed main()
{
    while(~scanf("%d",&n))
    {
        memset(f,-1,sizeof(f));
        ans=0;
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].d);
        sort(a+1,a+1+n,cmp);
        for(register int i=1,x;i<=n;i++)
         if((x=find(a[i].d))>0)
          ans+=a[i].p,f[x]=x-1;//还剩下x-1天
        printf("%d\n",ans);
    }
}

你可能感兴趣的:(并查集)