joj 2645

  并查集的一道题,绞尽脑汁想了用并查集算法但总是过不去,后来在网上查了代码(最近好像总是每次都有一个小错误过不去,蛋疼啊),发现了原来是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 */

 

posted @ 2011-09-29 12:14  DChipNau  阅读(98)  评论(0编辑  收藏  举报