贪心+并查集
#include<stdio.h>
#include<stdlib.h>
struct Product {
int p, t;
}pro[10005];
int f[10005],n;
int compare(const void *m,const void *n)
{
return (*(Product *)n).p-(*(Product *)m).p;
}
void init()
{
for (int i = 0; i <10005; i++)
f[i] = i;
}
int find(int i)
{
if(f[i]!=i)
f[i]=find(f[i]);
return f[i];
}
void unionSet(int m,int n)
{
int i=find(m);
int j=find(n);
f[i]=j;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i = 0; i < n; i++)
scanf("%d%d",&pro[i].p,&pro[i].t);
qsort(pro,n,sizeof(Product),compare);
init();
int sum=0;
for(int i=0;i<n;i++)
{
int temp=find(pro[i].t);
if(temp!=0)
{
sum+=pro[i].p;
unionSet(temp,temp-1);
}
}
printf("%d\n",sum);
}
}