標籤:submit return for ref mat 建築 sample namespace src
1029: [JSOI2007]建築搶修Time Limit: 4 Sec Memory Limit: 162 MB
Submit: 5041 Solved: 2242
[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 Input4
100 200
200 1300
1000 1250
2000 3200Sample Output3 這道題採用貪心思想,首先對於所有數的t2排序,隨後維護搶修的t1的大根堆,每次尋找堆中最大的看當前t1是否小於它,小於就替換掉。正確性顯然。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define LL long long10 using namespace std;11 int n;12 struct data{int t1,t2;}a[150005];13 bool cmp(data c1,data c2){return c1.t2<c2.t2;}14 struct cmp115 {16 bool operator()(data c1,data c2){return c1.t1<c2.t1;}17 };18 priority_queue<data,vector<data>,cmp1> q;19 int main()20 {21 scanf("%d",&n);22 for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t1,&a[i].t2);23 LL sum=0;24 int ans=0;25 sort(a+1,a+n+1,cmp);26 for(int i=1;i<=n;i++)27 {28 if(a[i].t2>=sum+a[i].t1){q.push(a[i]);ans++;sum+=a[i].t1;}29 else30 {31 if(q.empty()) continue;32 data now=q.top();33 if(now.t1>a[i].t1)34 {35 sum=sum-now.t1+a[i].t1;36 q.pop();37 q.push(a[i]);38 }39 }40 }41 printf("%d",ans);42 }
View Code
[BZOJ1029][JSOI2007]建築搶修