超市购物
题目链接:超市购物
题目描述
解题思路
这很明显是一道贪心。
我们先以价格为关键字排序,再一一枚举。如果当前货物被选中,那么其他的货物就推到第二天,这个操作我们可以用并查集实现。
code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int fa[100010];
struct abc{
int p,d;
}a[100010];
bool cmp(abc a,abc b)
{
return a.p>b.p;
}
int fd(int now)
{
if(fa[now]==now)
return now;
return fa[now]=fd(fa[now]);
}
int main()
{
while(cin>>n)
{
int ans=0;
for(int i=1;i<=10000;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].p,&a[i].d);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
int t=fd(a[i].d);
if(t)
{
ans+=a[i].p;
fa[t]=t-1;
}
}
cout<<ans<<endl;
}
}