建築搶修
time limit:10000ms memory limit:65536k
case time limit:1000ms
description
機關城內只有hy乙個修理工,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需要一定的時間。同時,hy修理完乙個建築才能修理下乙個建築,不能同時修理多個建築。如果某個建築在一段時間之內沒有完全修理完畢,這個建築就報廢了。
hy忙於四處修理建築,無暇進行計算,所以他希望你可以告訴他他最多可以搶修多少個建築。
input
第一行是乙個整數n,
接下來n行每行兩個整數t1,t2描述乙個建築:修理這個建築需要t1秒,如果在t2秒之內還沒有修理完成,這個建築就報廢了。
output
輸出乙個整數s,表示最多可以搶修s個建築。
sample input
4100 200
200 1300
1000 1250
2000 3200
sample output
3
hint
n<150000,t1
分析:
1.這道題採用了堆維護的思想。但是其實質是貪心。
2.首先我們先按照時間限制t2排序。
3.貪心的想,對於每乙個建築,我們等它快到限制的時候再修復它。
4.因為是想讓數量最多,再貪心的想:我們要選時間盡量短的。
5.那麼我們可以維護乙個大根堆,每次有衝突時,也即當前點無法修復的時候。如果當前的點的時間小於堆頂元素,就彈出堆頂元素並壓入當前點。
注意到:**中記錄當前用時總和的tot要用long long(顯然,tot-max=t1*n)
#include#include#include#include#includeusing namespace std;
inline void _read(int &x)
for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';
if(!sign)x=-x;
}int n;
int ans=0;
struct node;
node house[150005];
bool cmp(node a,node b)
sort(house+1,house+1+n,cmp);
for(i=1;i<=n;i++)
else if(tot+house[i].t1>house[i].t2&&heap.size()&&heap.top()>house[i].t1)
} cout<
BZOJ 1029 建築搶修(貪心堆)
原題代號 bzoj 1029 原題描述 建築搶修 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修...
NKOI 2375 建築搶修
建築搶修 time limit 10000ms memory limit 65536k total submit 24 accepted 15 case time limit 1000ms description 機關城內只有hy乙個修理工,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需要一定的...
JSOI2007 建築搶修
提交傳送門 這個就是乙個貪心唄,用set維護大到小的數列 然後如果能搶修乙個建築的話就ans 不能的話,看看比不比上一次搶修的優秀,優秀的話就選它,然後更換 description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部...