为了获取利润最大,所以贪心
把所有的商品按照利润排序。
接着通过并查集将已买的物品的父节点往前更新
知道t=0,即,已经到了最前端
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10010;
struct Item
{
int pro,end;
}item[maxn];
bool cmp(Item a,Item b)
{
return a.pro>b.pro;
}
int pre[maxn],val[maxn];
void init()
{
for(int i=0;i<=maxn;i++){
pre[i]=i;
// val[i]=0;
}
}
int find(int x)
{
if(x==pre[x]) return x;
int r=pre[x];
pre[x]=find(pre[x]);
return pre[x];
}
/*void Union(int x,int y,int dis)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy){
pre[fy]=fx;
}
} */
int main()
{
int n,a,b,dis,ans;
while(~scanf("%d",&n)){
init();
ans=0;
for(int i=0;i<n;i++)
scanf("%d%d",&item[i].pro,&item[i].end);
sort(item,item+n,cmp);
for(int i=0;i<n;i++){
int t=find(item[i].end);
if(t>0){
ans+=item[i].pro;
pre[t]=t-1;
}
}
cout<<ans<<endl;
}
return 0;
}