bzoj 1029 建築搶修 貪心 優先佇列

2021-06-28 04:23:35 字數 1208 閱讀 5249

傳送門:

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

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

輸出乙個整數s,表示最多可以搶修s個建築。 資料範圍: n<150000,t1

4100 200

200 1300

1000 1250

2000 32003

貪心+優先佇列

先按照t2從小到大排序,再掃一遍判斷

1.若當前可以修建,就修建

2.若當前不可以修建,分兩種情況:

1.當前任務t1>當前最大的(priority_queue的top元素) 跳過

2.當前任務t1《當前最大的,交換

恩,就是這樣~~

#include#include#include#include#include#include#define maxn 150005

using namespace std;

int n;

int cur,ans;

struct p{

int t1,t2;

bool operator <(const p b)const

{ return t2q;

int main()

{ scanf("%d",&n);

for(int i=1;i<=n;i++)

scanf("%d%d",&p[i].t1,&p[i].t2);

sort(p+1,p+n+1);

for(int i=1;i<=n;i++)

{if(p[i].t1+cur<=p[i].t2) ans++,q.push(p[i].t1),cur+=p[i].t1;

else

{if(q.empty()) continue;

int val=q.top();

if(val



BZOJ 1029 建築搶修(貪心)

time limit 4 sec memory limit 162 mb submit 4874 solved 2183 submit status discuss 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經...

BZOJ1029 建築搶修(貪心)

bzoj 洛谷感覺自己已經不會貪心了。很明顯的乙個想法是按照終止時間排序,然後能選則選。但是這樣子可能會因為前面選擇了乙個修理時間很長的,導致現在這個不能選。那麼我們加乙個大根堆,把所有已經選擇的修理時間全部壓進去。如果當前這個不能選的話,檢查是否能夠減少修堆頂那個,來讓現在這個能夠被修。inclu...

BZOJ 1029 建築搶修(貪心堆)

原題代號 bzoj 1029 原題描述 建築搶修 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修...