BZOJ 1029 JSOI2007 建築搶修

2022-08-12 05:27:10 字數 1481 閱讀 1019

\(n\)個任務需要完成,給出每個任務所需時間\(t_1\)與deadline\(t_2\),問最多能完成多少個任務.

對於兩個任務\(a,b\),設\(b.t_2>a.t_2\).

1.先完成\(b\),再完成\(a\),那麼要求\(t+a.t_1+b.t_1<=a.t_2

2.先完成\(a\),再完成\(b\),那麼要求\(t+a.t_1<=a.t_2,t+a.t_1+b.t_1<=b.t_2\).

顯然第二種方案條件更寬鬆,更可能實現,所以我們先完成deadline小的.

先以\(t_2\)為關鍵字排序.對於第\(i\)個任務:

1.如果時間允許,那麼完成它,併入隊,ans++.

2.如果時間不允許,如果隊中\(t_1\)最大的比當前任務的\(t_1\)還要大,那麼取出隊頭,把當前任務加進去(答案不變,但是讓後面的任務的時間更充裕).

1 #include 2

using

namespace

std;34

const

int maxn=150000+5;5

intn;

6struct

node

9bool

operator

< (const node &a) const

10}a[maxn];

11 inline void

solve()20}

21 printf("

%d\n

",ans);22}

23 inline void

init()

28int

main()

view code

time limit: 4 sec  memory limit: 162 mb

submit: 3565  solved: 1637

[submit][status][discuss]

小剛在玩jsoi提供的乙個稱之為「建築搶修」的電腦遊戲:經過了一場激烈的戰鬥,t部落消滅了所有z部落的

入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全

毀壞。現在的情況是:t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需

要一定的時間。同時,修理工人修理完乙個建築才能修理下乙個建築,不能同時修理多個建築。如果某個建築在一

段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂乙個修理順序,以搶修盡可能多

的建築。

第一行是乙個整數n接下來n行每行兩個整數t1,t2描述乙個建築:修理這個建築需要t1秒,如果在t2秒之內還

沒有修理完成,這個建築就報廢了。

輸出乙個整數s,表示最多可以搶修s個建築.n < 150,000;  t1 < t2 < maxlongint

4100 200

200 1300

1000 1250

2000 3200

3

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部落基地裡只有乙個修理工人,雖然他能瞬間到達任...