傳送門:
小剛在玩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部落基地裡只有乙個修...