原題代號:bzoj 1029
原題描述:
建築搶修
小剛在玩jsoi提供的乙個稱之為「建築搶修」的電腦遊戲:經過了一場激烈的戰鬥,t部落消滅了所有z部落的
入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全
毀壞。現在的情況是:t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需
要一定的時間。同時,修理工人修理完乙個建築才能修理下乙個建築,不能同時修理多個建築。如果某個建築在一
段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂乙個修理順序,以搶修盡可能多
的建築。
input
第一行是乙個整數n接下來n行每行兩個整數t1,t2描述乙個建築:修理這個建築需要t1秒,如果在t2秒之內還
沒有修理完成,這個建築就報廢了。
output
輸出乙個整數s,表示最多可以搶修s個建築.n < 150,000; t1 < t2 < maxlongint
sample input
4sample output100 200
200 1300
1000 1250
2000 3200
3
先按第二個時間對所有的建築排個序,然後直接貪心是不行的,所以需要用到優先佇列,如果能直接搶修的就搶修,同時將t1的值儲存在優先佇列中(因為優先佇列預設大數在頂部)如果碰到搶修時間不夠的建築,判斷一下優先對列頂部的建築物搶修時間是否大於這個時間不夠的搶修時間,如果大於則進行替換,這樣能留出更多的時間得到最優解
ac**:
# include # include# include
# include
# include
# include
# include
# include
# include
# include
# include
using
namespace
std;
# define pi acos(-1.0
)# define mem(a,b) memset(a,b,
sizeof
(a))
# define for(i,a,n)
for(int i=a; i<=n; ++i)
# define for(i,n,a)
for(int i=n; i>=a; --i)
# define fo(i,a,n)
for(int i=a; ii)
# define fo(i,n,a)
for(int i=n; i>a ;--i)
typedef
long
long
ll;typedef unsigned
long
long
ull;
struct
construction
a[150005
];bool
cmp(construction a,construction b)
intsum,num;
priority_queue
q;intmain()
sort(a+1,a+n+1
,cmp);
for(int i=1; i<=n; i++)
else}}
cout
return0;
}
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 建築搶修 貪心 優先佇列
傳送門 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復...