標籤:input top stream algo ade jsoi2007 log 入侵者 lag
Description
小剛在玩JSOI提供的一個稱之為“建築搶修”的電腦遊戲:經過了一場激烈的戰鬥,T部落消滅了所有z部落的
入侵者。但是T部落的基地裡已經有N個建築設施受到了嚴重的損傷,如果不儘快修複的話,這些建築設施將會完全
毀壞。現在的情況是:T部落基地裡只有一個修理工人,雖然他能瞬間到達任何一個建築,但是修複每個建築都需
要一定的時間。同時,修理工人修理完一個建築才能修理下一個建築,不能同時修理多個建築。如果某個建築在一
段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂一個修理順序,以搶修儘可能多
的建築。
Input
第一行是一個整數N接下來N行每行兩個整數T1,T2描述一個建築:修理這個建築需要T1秒,如果在T2秒之內還
沒有修理完成,這個建築就報廢了。
Output
輸出一個整數S,表示最多可以搶修S個建築.N < 150,000; T1 < T2 < maxlongint
Sample Input4
100 200
200 1300
1000 1250
2000 3200Sample Output3 HINTSource
按這種思維搞下去,遲早AFO了,碰到貪心題就掛爛了
太羞恥了,大致就是就是用堆來調整排序後的貪心,因為後面修的堆前面沒影響,然後就是要讓對後面的影響盡量小;
// MADE BY QT666#include<cstdio>#include<algorithm>#include<cmath>#include<iostream>#include<cstring>#include<queue>using namespace std;typedef long long ll;const int N=300050;int gi(){ int x=0,flag=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) flag=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*flag;}struct data{ int t1,t2;}house[N];bool cmp(const data &a,const data &b){ if(a.t2==b.t2) return a.t1<b.t1; else return a.t2<b.t2;}priority_queue<int>q;int main(){ int n=gi(); for(int i=1;i<=n;i++){ house[i].t1=gi(),house[i].t2=gi(); } sort(house+1,house+1+n,cmp); q.push(house[1].t1);int ans=1,time=house[1].t1; for(int i=2;i<=n;i++){ if(time+house[i].t1<=house[i].t2){ ans++;time+=house[i].t1; q.push(house[i].t1); } else{ int Max=q.top(); if(house[i].t1<Max){time=time-Max+house[i].t1;q.pop();q.push(house[i].t1); } } } printf("%d\n",ans); return 0;}
bzoj 1029: [JSOI2007]建築搶修