題目鏈接: http://www.lydsy.com/JudgeOnline/problem.php?id=1029
小剛在玩JSOI提供的一個稱之為“建筑搶修”的電腦游戲:經過了一場激烈的戰斗,T部落消滅了所有z部落的入侵者。但是T部落的基地里已經有N個建筑設施受到了嚴重的損傷,如果不盡快修復的話,這些建筑設施將會完全毀壞。現在的情況是:T部落基地里只有一個修理工人,雖然他能瞬間到達任何一個建筑,但是修復每個建筑都需要一定的時間。同時,修理工人修理完一個建筑才能修理下一個建筑,不能同時修理多個建筑。如果某個建筑在一段時間之內沒有完全修理完畢,這個建筑就報廢了。你的任務是幫小剛合理的制訂一個修理順序,以搶修盡可能多的建筑。
Input
第一行是一個整數N,接下來N行每行兩個整數T1,T2描述一個建筑:修理這個建筑需要T1秒,如果在T2秒之內還沒有修理完成,這個建筑就報廢了。
Output
輸出一個整數S,表示最多可以搶修S個建筑。 數據范圍: N<150000
算法分析:首先貪心排序一下,優先選擇更早修理完成的建筑(即優先選擇T2小的),本以為這樣就可以了,交了幾次都WA了,仔細想了想,如果當前這個建筑來不及修好,可是之前修好的建筑里面有一個建筑修理時間比它長,那么我們放棄修理原來那個修理時間長的,轉而修理當前這個建筑,那么,在當前修理建筑個數不變的情況下,用的時間會更少,于是,用優先隊列保存一下原來修好了的建筑修理時間,然后,跟著上面那個思想處理一下就OK了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #define inf 0x7fffffff 9 using namespace std; 10 const int maxn= 150000 + 100 ; 11 12 int n; 13 struct node 14 { 15 int num,r; 16 friend bool operator < (node a,node b) 17 { 18 return a.r< b.r; 19 } 20 }an[maxn]; 21 22 priority_queue< int > Q; 23 int main() 24 { 25 while (scanf( " %d " ,&n)!= EOF) 26 { 27 for ( int i= 0 ;i<n ;i++) scanf( " %d%d " ,&an[i].num,& an[i].r); 28 sort(an,an+ n); 29 while (! Q.empty()) Q.pop() ; 30 int ans= 0 ,e= 0 ; 31 for ( int i= 0 ;i<n ;i++ ) 32 { 33 if (an[i].r-an[i].num+ 1 > e) 34 { 35 e += an[i].num; 36 Q.push(an[i].num); 37 ans++ ; 38 } 39 else 40 { 41 if (Q.empty()) continue ; 42 int t= Q.top() ; 43 if (t> an[i].num) 44 { 45 e -= t ;e += an[i].num; 46 Q.pop() ;Q.push(an[i].num); 47 } 48 } 49 } 50 printf( " %d\n " ,ans); 51 } 52 return 0 ; 53 }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
