1. 程式人生 > >bzoj 1029 [JSOI2007]建築搶修 - 貪心 + 大根堆

bzoj 1029 [JSOI2007]建築搶修 - 貪心 + 大根堆

emp lap priority ring 們的 pri building ons 嚴重

1029: [JSOI2007]建築搶修

Time Limit: 4 Sec Memory Limit: 162 MB

Description

  小剛在玩JSOI提供的一個稱之為“建築搶修”的電腦遊戲:經過了一場激烈的戰鬥,T部落消滅了所有z部落的
入侵者。但是T部落的基地裏已經有N個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全
毀壞。現在的情況是:T部落基地裏只有一個修理工人,雖然他能瞬間到達任何一個建築,但是修復每個建築都需
要一定的時間。同時,修理工人修理完一個建築才能修理下一個建築,不能同時修理多個建築。如果某個建築在一
段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂一個修理順序,以搶修盡可能多
的建築。

Input

  第一行是一個整數N接下來N行每行兩個整數T1,T2描述一個建築:修理這個建築需要T1秒,如果在T2秒之內還
沒有修理完成,這個建築就報廢了。

Output

  輸出一個整數S,表示最多可以搶修S個建築.N < 150,000; T1 < T2 < maxlongint

Sample Input

4
100 200
200 1300
1000 1250
2000 3200

Sample Output

3 從感性來看,如果想要修盡可能多的塔,一定要把限期靠前的先造 因此我們先按照限期從小到大排序 然後在考慮貪心 我們存一個造完之前所有塔的結束時間,當新加入一個塔時,如果依舊沒要超過這個塔的對應時間,就直接把他加入到我們的修建序列裏
如果發現現有時間造不完這個塔,我們就拿大根堆堆頂的塔和他交換(如果比他大) 這樣我們總的建造時間會減小,但總數不變 技術分享圖片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #define LL long long
 7 
 8 using namespace std;
 9 
10 const int MAXN = 2e5 + 10; 
11 int N;
12
int ans = 0; 13 int cnt = 0; 14 priority_queue<int> q; 15 struct building { 16 int t1; 17 int t2; 18 } b[MAXN]; 19 20 inline LL read() 21 { 22 LL x = 0, w = 1; char ch = 0; 23 while(ch < 0 || ch > 9) { 24 if(ch == -) { 25 w = -1; 26 } 27 ch = getchar(); 28 } 29 while(ch >= 0 && ch <= 9) { 30 x = x * 10 + ch - 0; 31 ch = getchar(); 32 } 33 return x * w; 34 } 35 36 bool cmp(building a, building b) 37 { 38 if(a.t2 == b.t2) { 39 return a.t1 < b.t1; 40 } 41 return a.t2 < b.t2; 42 } 43 int main() 44 { 45 N = read(); 46 for(int i = 1; i <= N; i++) { 47 b[i].t1 = read(), b[i].t2 = read(); 48 } 49 sort(b + 1, b + N + 1, cmp); 50 for(int i = 1; i <= N; i++) { 51 if(cnt + b[i].t1 <= b[i].t2) { 52 q.push(b[i].t1); 53 cnt += b[i].t1; 54 ans++; 55 } else { 56 if(!q.empty()) { 57 int t = q.top(); 58 if(b[i].t1 < q.top()) { 59 cnt = cnt - t + b[i].t1; 60 q.pop(); 61 q.push(b[i].t1); 62 } 63 } 64 } 65 } 66 printf("%d\n", ans); 67 }
View Code

bzoj 1029 [JSOI2007]建築搶修 - 貪心 + 大根堆