time limit: 4 sec
memory limit: 162 mb
submit: 4807
solved: 2157 [
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 32003
[ submit][
status][
discuss]
非常水的貪心。。。
然而蒟蒻還是改了乙個晚上才改出來
這一題先把所有的建築按t2排序
按t2的不同分成幾類
每一類中都需要從小到大排
然後列舉每一種t2下的每乙個建築
分類討論
如果當前建築加上使用的時間小等t2,那麼就統計一下時間,ans++
如果當前建築加上使用的時間大於t2,
這時候我們可以考慮利用這乙個建築去換掉當前決策中使用時間大於它的建築
如此重複重複。。。。
然後這題就解出來啦!
注:可能會爆int
**:
#include#include#includeusing namespace std;
const int maxn = 150010;
typedef long long ll;
struct data
}b[maxn];
priority_queueq[maxn];
priority_queuecur;
ll time[maxn],top,n,m,tot,ans;
inline ll getint()
inline bool cmp(data a,data b)
int main()
sort(b + 1,b + n + 1,cmp);
for (int i = 1; i <= n; i++)
q[tot].push(b[i]);
} ll used = 0;
for (int i = 1; i <= tot; i++)
else
else
break;
}q[i].pop();
} }printf("%d",ans);
return 0;
}
bzoj1029 JSOI2007 建築搶修
傳送門 貪心顯然。1.按照最後時限排序,暴力插入。但是顯然會錯。10 10 10 20 2 21 2 21 2 21 答案是2,但是顯然最優的是4 於是考慮改進。2.在無法修理時我們可以放棄花費時間最長的工作。明顯花費時間最長的工作時間大於當前工作是修改更優。我們可以用乙個大根堆實現。然後就通過了。...
bzoj1029 JSOI2007 建築搶修
description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任...
BZOJ 1029 JSOI2007 建築搶修
題目鏈結 題意 題解 按照t2公升序排 順序列舉每乙個建築 如果當前建築能夠修理 則修理它 並將它的t1值加入到堆中 然後累加當前所用的時間now 如果加了這個t1之後會大於t2則這個建築沒辦法修理 則在堆裡面去找 看看有沒有比t1大的值 如果有的話,就改修這個建築 而那個建築不修了 這樣雖然不能增...