本题题意是很好理解的,输出最大的利润,但是我怎么都想不到运用并查集来做,后来百度,看了“无忧望月”的博客,才知道的,下面的代码也是看了他的才写出来的,ps,记得在操作之前初始化
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10000+100;
int par[maxn];
struct node{
int pi,di;
}p[maxn];
int sum;
bool cmp(node n1,node n2)
{
if(n1.pi!=n2.pi)
return n1.pi>n2.pi;
return n1.di<n2.di;
}
int find(int x)
{
//cout<<x<<endl;
return x==par[x]?x:par[x]=find(par[x]);
}
void init()
{
sum=0;
for(int i=0;i<maxn;i++)
par[i]=i;
}
int main()
{
int n,x;
//freopen("G.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
init();
//cout<<n<<endl;
for(int i=0;i<n;i++)
{
scanf("%d %d",&p[i].pi,&p[i].di);
//cout<<p[i].pi<<" "<<p[i].di<<endl;
}
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
{
//cout<<p[i].di<<endl;
int x=find(p[i].di);
//cout<<x<<endl;
if(x!=0)
{
//cout<<"here"<<endl;
sum+=p[i].pi;
par[x]=x-1;
}
}
printf("%d\n",sum);
}
return 0;
}