洛谷P4053 JSOI2007 建築搶修

2022-05-16 07:11:13 字數 1091 閱讀 3178

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

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

輸出乙個整數s,表示最多可以搶修s個建築.

4100 200

200 1300

1000 1250

2000 3200

n < 150,000; t1 < t2 < maxlongint

不妨先按照建築的報廢時間排序,然後能修理的就修。但這樣並不能保證正確性。觀察到如果乙個任務太耗時間,我們完全可以用另乙個時間更短的任務去替代它而不會損失答案。所以,按報廢時間排序後仍然依次掃一遍,能選就選;同時用堆維護之前所有任務的耗時最大值,如果當前任務不能選,就看它的耗時是否小於之前最大的耗時,如果小於就替換掉耗時最大的任務,同時更新剩餘時間。這樣可以保證正確性。

#include #include #include #include #define int long long

#define n 150002

using namespace std;

priority_queueq;

struct nodea[n];

int n,i,t,ans;

int read()

return w;

}int my_comp(const node &x,const node &y)

{ return x.t2a[i].t2){

if(a[i].t1先想著按照結束時間貪心,但這顯然不對。我們可以把前面的決策改一下,使當前仍然是最優解。

之前想著用兩個變數的關係來貪心,但這種題目並不能這樣做。更改前面的決策使當前解最優也是一種貪心的思想。

P4053 JSOI2007 建築搶修

小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築...

P4053 JSOI2007 建築搶修

miku 貪心按照時間從前往後盡可能的修 如果能修就修,修不了的話 我們可以選擇撤掉乙個以前修的騰出時間來,但是,騰出兩個顯然更蠢 那麼,顯然無論騰不騰,截止到此建築,能修的數量最多一定 由此觀之,應該把已修的最大的取出來,然後進行比較,放進小的,扔掉大的,來為後面騰時間 include inclu...

P4053 JSOI2007 建築搶修

傳送門 看題目就想到 dp 想不出來就去想貪心.考慮按右端點排序,乙個個修,如果在修某個建築 i 時發現來不及了,說明前 i 個建築最多只能修 i 1 個 那麼我們把前 i 個中耗時最長的那個放棄,這樣省下的時間最多 然後用優先佇列維護一下就行 include include include inc...