1. 程式人生 > >JZYZOJ1622 [usaco2009]工作安排 貪心

JZYZOJ1622 [usaco2009]工作安排 貪心

第一個 spa stream 任務 ace space class isp sort

和p1123智力大沖浪一樣,可以用優先隊列寫... 每一秒可以做一個工作....因為n個任務只要在限制之前完成就行,所以時間不沖突的話肯定越早做完越好..所以最多的時間是n,當然限定的完成時間中最大的可能小於n,或者有的時間重疊什麽的,所以大多數情況用不了n個時間.... 所以我們就可以以時間為變量制造一個貪心,int now代表做一個工作前的時間,ans代表最大值,把工作按照時間順序排序,然後不停地把p_i加到ans裏,加進去一個now++一次,只要now不超過b_i就完全沒有問題; 但是b_i<now+1了我們就需要去掉之前加進去的最小的那個工作然後now--(包括i),找最小這種事情就要優先隊列來做... 那麽now--後怎麽就能確保now+1<=b_i? 這個東西和開始掃描前的排序有關系了,因為b_(i-1)肯定能放進去,那麽當時now+1<=b_(i-1);而b_i>=b_(i-1),那麽b_(i-1)放進去後now++一次就說明這個時候now<=b_i,然後就證明了這個問題; 那麽b_(i-1)為什麽能放進去?只需要往前推就好了啊...第一個任務肯定是能放進去的... 嗯沒有下面了 技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 long long n;
 9 struct wtff{
10     long long d,p;
11 }wtf[100010];
12 priority_queue< long long >q;
13 bool mycmp(wtff a,wtff b){
14 return (a.d<b.d|| 15 (a.d==b.d&&a.p<b.p)); 16 } 17 int main(){ 18 long long ans=0; 19 cin>>n; 20 for(int i=1;i<=n;i++){ 21 scanf("%lld%lld",&wtf[i].d,&wtf[i].p); 22 } 23 sort(wtf+1,wtf+1+n,mycmp); 24 int now=0; 25 for(int i=1
;i<=n;i++){ 26 ans+=wtf[i].p; 27 now++; 28 q.push(-wtf[i].p); 29 if(now>wtf[i].d){ 30 ans+=q.top(); 31 q.pop(); 32 now--; 33 } 34 } 35 cout<<ans<<endl; 36 return 0; 37 }
View Code

JZYZOJ1622 [usaco2009]工作安排 貪心