time limit: 4 sec memory limit: 162 mb
submit: 5866 solved: 2634
[submit][status][discuss]
description
小剛在玩jsoi提供的乙個稱之為「建築搶修」的電腦遊戲:經過了一場激烈的戰鬥,t部落消滅了所有z部落的
入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全
毀壞。現在的情況是:t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築都需
要一定的時間。同時,修理工人修理完乙個建築才能修理下乙個建築,不能同時修理多個建築。如果某個建築在一
段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂乙個修理順序,以搶修盡可能多
的建築。
input
第一行是乙個整數n接下來n行每行兩個整數t1,t2描述乙個建築:修理這個建築需要t1秒,如果在t2秒之內還
沒有修理完成,這個建築就報廢了。
output
輸出乙個整數s,表示最多可以搶修s個建築.n < 150,000; t1 < t2 < maxlongint
sample input
4100 200
200 1300
1000 1250
2000 3200
sample output
3 思路題,首先按截止時間排序。但是如果直接按截止時間做顯然錯誤,所以我們思考持續時間。我們先貪心的選取截止時間考前的,如果發現乙個選不了的,就從已經選了的挑出持續時間最長的,如果大於此時列舉的,就替換,這裡用優先佇列維護。
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int maxn = 150005;
inline ll rd()
while(isdigit(ch))
return x*f;
}int n;
ll ans;
priority_queue q;
struct buildbuild[maxn];
inline
bool cmp(build a,build b)
// if(sum+(n-x)<=ans) return;
// if(last+build[x].st<=build[x].ed) dfs(x+1,last+build[x].st,sum+1);
// dfs(x+1,last,sum);
//}int main()
sort(build+1,build+1+n,cmp);
// dfs(1,0,0);
ll now=0;
for(register
int i=1;i<=n;i++)
else}}
printf("%lld",ans);
return
0;}
bzoj1029 JSOI2007 建築搶修
傳送門 貪心顯然。1.按照最後時限排序,暴力插入。但是顯然會錯。10 10 10 20 2 21 2 21 2 21 答案是2,但是顯然最優的是4 於是考慮改進。2.在無法修理時我們可以放棄花費時間最長的工作。明顯花費時間最長的工作時間大於當前工作是修改更優。我們可以用乙個大根堆實現。然後就通過了。...
bzoj1029 JSOI2007 建築搶修
time limit 4 sec memory limit 162 mb submit 4807 solved 2157 submit status discuss 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經...
bzoj1029 JSOI2007 建築搶修
description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任...