POJ 1456 Supermarket【并查集】
题意: 有N件商品,知道了商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间,求出最大利润。
分析:利用并查集按利润排序,建立一个关于时间的并查集
每次插入一个物品时,若该物品时间为 i,找出find(i),记为t,若t不为0,则将该物品安排到t这个时间完成,并使f[t]=t-1 亦即对于每个物品尽量
安排在后边完成,安排后将fa指针前移,表示这个时间已经被占用,下次需要插入到它之前。
#include<stdio.h> #include<string.h> #include<algorithm> #define clr(x)memset(x,0,sizeof(x)) using namespace std; #define maxn 10010 int f[maxn]; struct node { int w,end; }q[maxn]; bool operator < (const node& a,const node& b) { return a.w>b.w; } int find(int x) { return f[x]==x?x:(f[x]=find(f[x])); } int main() { int n,r,res,i; while(scanf("%d",&n)!=EOF) { res=0; for(i=0;i<maxn;i++) f[i]=i; for(i=0;i<n;i++) scanf("%d%d",&q[i].w,&q[i].end); sort(q,q+n); for(i=0;i<n;i++) { r=find(q[i].end); if(r>0) { f[r]=r-1; res+=q[i].w; } } printf("%d\n",res); } return 0; }