[Usaco2009 Open]工做安排Job

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1457  Solved: 687
[Submit][Status][Discuss]
php

Description

Farmer John 有太多的工做要作啊!!!!!!!!爲了讓農場高效運轉,他必須靠他的工做賺錢,每項工做花一個單位時間。 他的工做日從0時刻開始,有1000000000個單位時間(!)。在任一時刻,他均可以選擇編號1~N的N(1 <= N <= 100000)項工做中的任意一項工做來完成。 由於他在每一個單位時間裏只能作一個工做,而每項工做又有一個截止日期,因此他很難有時間完成全部N個工做,雖然仍是有可能。 對於第i個工做,有一個截止時間D_i(1 <= D_i <= 1000000000),若是他能夠完成這個工做,那麼他能夠獲利P_i( 1<=P_i<=1000000000 ). 在給定的工做利潤和截止時間下,FJ可以得到的利潤最大爲多少呢?答案可能會超過32位整型。 spa

Input

第1行:一個整數N. 第2~N+1行:第i+1行有兩個用空格分開的整數:D_i和P_i. code

Output

輸出一行,裏面有一個整數,表示最大獲利值。 blog

Sample Input

3
2 10
1 5
1 7

Sample Output

17

HINT

第1個單位時間完成第3個工做(1,7),而後在第2個單位時間完成第1個工做(2,10)以達到最大利潤 排序

Source

Goldip

思路

顯然,限制大於n的工做必定能完成;get

其餘的,按價值從大到小排序,並查集維護添加便可;it

代碼實現

 1 #include<cstdio>
 2 #include<algorithm>
 3 const int maxn=1e5+10;
 4 int n;
 5 int f[maxn];
 6 long long ans;
 7 struct nate{int d,p;}s[maxn];
 8 bool comp(nate x,nate y){return x.p>y.p;}
 9 int ff(int k){return f[k]==k?k:f[k]=ff(f[k]);}
10 int main(){
11     scanf("%d",&n);
12     int d,p;
13     for(int i=1;i<=n;i++){
14         scanf("%d%d",&d,&p);
15         if(d>n) ans+=p;
16         else s[i].d=d,s[i].p=p;
17     }
18     std::sort(s+1,s+n+1,comp);
19     for(int i=1;i<=n;i++) f[i]=i;
20     for(int i=1;i<=n&&s[i].p;i++){
21         d=ff(f[s[i].d]);
22         if(d) ans+=s[i].p,f[d]=d-1;
23     }
24     printf("%lld\n",ans);
25     return 0;
26 }
相關文章
相關標籤/搜索