【POJ】1456 supermarket
给定 n 件物品,第 i件物品有如下信息:
卖出去可以得到pi的收益。
过期时间为di ,过了过期时间就不能再卖出去。
卖掉一件物品要用 1 的时间,求最大收益。
多组数据,每组数据一行,首先一个整数 n然后 n对数pi ,di ,以文件终止符结束。
0≤n≤10000
1≤pi,di ≤10000 。
思路
先按收益排序。
用剩余过期时间做并查集。
若没有过时。
加收益,剩余过期时间-1;
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct jgt
{
int d,p;
}a[10010];
int n,f[10010];
int find(int x)//找代表值
{
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
bool cmp(jgt t1,jgt t2)
{
return t1.p>t2.p;
}
int main()
{
int mx,ans,i,t;
while(cin>>n)
{
for(mx=0,i=0;i<n;mx=max(mx,a[i].d),i++)
scanf("%d%d",&a[i].p,&a[i].d);
for(i=0;i<=mx;f[i]=i,i++);
sort(a,a+n,cmp);//先按收益排序
for(ans=0,i=0;i<n;i++)
{
t=find(a[i].d);
if(t>0)
{
ans+=a[i].p;//加收益
f[t]=t-1;//剩余过期时间-1
}
}
printf("%d\n",ans);
}
return 0;
}