1. 程式人生 > >Week 1 #H 建築搶修

Week 1 #H 建築搶修

pan ostream c代碼 for 遊戲 i++ g++ priority queue

原題描述:

H - 建築搶修

小剛在玩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
這道題我們定義了結構體,用到了優先隊列還有定義的排序(貪心
結構體我們用來表示花費時間和限制時間。
優先隊列是隊列的升級版,他不在是先進先出了,而是有優先級,最原始的定義的越大的優先級越高也就是排在對首。當然其他函數都不變,只是front()函數又變回了top()函數。
我們定義一和cmp函數來定義新的排序。
我們先把限制時間按照從小到大的排序,看下時間超限了沒有。沒有就把修復時間放到優先隊列中。如果超限了,就把隊列的首元素(隊列的最大整數)和超限的修復時間比較,大的話直接替換。可以想一想為什麽可以直接替換。
AC代碼:
 1 #include <iostream>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=150001;
 6 struct mmp
 7 {
 8      int T1,T2;
 9 }a[N];
10 priority_queue <int> team;
11 bool cmp(mmp x,mmp y){return x.T2<y.T2;}
12 int main()
13 {
14     int n,t=0,g=0;
15 cin>>n; 16 for(int i=1;i<=n;i++) 17 cin>>a[i].T1>>a[i].T2; 18 sort(a+1,a+n+1,cmp); 19 for(int i=1;i<=n;i++) 20 { 21 if(t+a[i].T1<=a[i].T2) 22 { 23 t+=a[i].T1; 24 g++; 25 team.push(a[i].T1); 26 } 27 else 28 { 29 if(team.top()>a[i].T1) 30 { 31 t=t-team.top()+a[i].T1; 32 team.pop(); 33 team.push(a[i].T1); 34 } 35 } 36 } 37 cout<<g<<endl; 38 }

Week 1 #H 建築搶修