小剛在玩jsoi提供的乙個稱之為「建築搶修」的電腦遊戲:經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有\(n\)個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是:t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需要一定的時間。同時,修理工人修理完乙個建築才能修理下乙個建築,不能同時修理多個建築。如果某個建築在一段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂乙個修理順序,以搶修盡可能多的建築。
第一行是乙個整數\(n\)接下來\(n\)行每行兩個整數\(t1\),\(t2\)描述乙個建築:修理這個建築需要\(t1\)秒,如果在\(t2\)秒之內還沒有修理完成,這個建築就報廢了。
輸出乙個整數s,表示最多可以搶修s個建築.\(n < 150000\); \(t1 < t2 < maxlongint\)
4100 200
200 1300
1000 1250
2000 3200
此題顯然是貪心。先按\(t2\)排序,然後依次處理,我們維護乙個大根堆, 每修理一棟建築,我們就把這棟建築的\(t1\)值加入堆,若當前無法修理 我們判斷堆頂是否比這棟建築的\(t1\)大,如果大,取消修理堆頂,改為修理當前建築。這個貪心的正確性是容易證明的。處理到乙個建築時,前面的處理順序對當前決策並無影響,所以選擇放棄之前修理過的\(t1\)最大的必然比次大的優,因為這樣雖然不能更新答案,但是可以為後面的建築提供更多的「空間」。這樣想通了**兩分鐘就寫好了。
#includeusing namespace std;
inline int read()
while (ch <= '9' && ch >= '0')
return x * flag;
}#define n 150001
#define rep(ii, aa, bb) for (int ii = aa; ii <= bb; ii++)
#define ll long long
int n;
struct node a[n];
bool cmp(const node x, const node b)
priority_queueq;
int main()
bzoj1029 JSOI2007 建築搶修
傳送門 貪心顯然。1.按照最後時限排序,暴力插入。但是顯然會錯。10 10 10 20 2 21 2 21 2 21 答案是2,但是顯然最優的是4 於是考慮改進。2.在無法修理時我們可以放棄花費時間最長的工作。明顯花費時間最長的工作時間大於當前工作是修改更優。我們可以用乙個大根堆實現。然後就通過了。...
bzoj1029 JSOI2007 建築搶修
time limit 4 sec memory limit 162 mb submit 4807 solved 2157 submit status discuss 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經...
bzoj1029 JSOI2007 建築搶修
description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任...