建築維修(貪心)
阿新 • • 發佈:2017-07-23
ros bsp tor clas urn 接下來 gin 一個數 表示
入侵者。但是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.我們希望能把花費時間最短的先修好;
2.我們希望保留保持時間最長的在最後;
3.我們要盡快修好即將超時的;
算法:對於這道題,我知道第一個數和第二個數是相關聯的,所以希望用到map來進行連接,這是可行的;(循環的使用叠代器即可)。
但我們仔細的想一下,這是一個建築construction類,包含函數成員和屬性(消耗的時間,維持的時間),因此在使用c++時,我們可以用
struct代替類。
至此,我們可以隨意的調用兩者了;
struct construction { int x,y; void Read() { cin >> x >> y; } bool operator < (const construction &o) const { return y < o.y; } }o[maxn];
void solve() { sort(o,o+N); int use_time=0,complish=0; for(int i=0;i<N;i++) {if(use_time+o[i].x<=o[i].y) { use_time+=o[i].x; q.push(o[i].x); complish ++; } else { int a = q.top(); if(a>o[i].x && use_time-a+o[i].x<o[i].y)//假設下一個的花費得的時間少於前面一個的時間,同時修好建築後不超時,說明這個才是局部最優解; { q.pop(); q.push(o[i].x); use_time += o[i].x-a; } } } cout << complish; }
借鑒 :JSZX11556
建築維修(貪心)