并查集的一道题,绞尽脑汁想了用并查集算法但总是过不去,后来在网上查了代码(最近好像总是每次都有一个小错误过不去,蛋疼啊),发现了原来是sum应该定义为longlong - - ,但我不会用那东西,毕竟不同的oj对他的输入输出控制不同,所以用的double,最后发现竟然挤进了这道前十,对我是莫大的鼓舞啊:
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
struct task{
int p;
int d;
};
task t[100008];
int m[100008];
bool cmp(task a,task b)
{
return a.p>b.p;
}
int find(int x)
{
if(m[x]==x)
return x;
else return m[x]=find(m[x]);
}
void uion(int a,int b)
{
m[b]=a;
}
int main()
{
int i,n;
for(i=0;i<100008;i++)
m[i]=i;
while(scanf("%d",&n)!=EOF)
{
vector<int> v;
int len=0,max_day,j;
double sum=0;
for(i=1;i<=n;i++)
scanf("%d%d",&t[i].p,&t[i].d);
sort(t+1,t+n+1,cmp);
for(i=1;i<=n;i++)
{
int a=find(t[i].d);
if(a>0)
{
uion(a-1,a);
sum+=t[i].p;
v.push_back(a);
}
}
for(i=0;i<v.size();i++)
m[v[i]]=v[i];
printf("%.0lf\n",sum);
}
}
/*
7
35 4 30 2 25 4 20 3 15 4 10 8 5 3
4
100 2 30 1 15 2 20 1 */