原题描述:
H - 建筑抢修
小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的
入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全
毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需
要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一
段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多
的建筑。
Input
第一行是一个整数N接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还
没有修理完成,这个建筑就报废了。
Output
输出一个整数S,表示最多可以抢修S个建筑.N < 150,000; T1 < T2 < maxlongint
Sample Input
4 100 200 200 1300 1000 1250 2000 3200
Sample Output
3这道题我们定义了结构体,用到了优先队列还有定义的排序(贪心)结构体我们用来表示花费时间和限制时间。优先队列是队列的升级版,他不在是先进先出了,而是有优先级,最原始的定义的越大的优先级越高也就是排在对首。当然其他函数都不变,只是front()函数又变回了top()函数。我们定义一和cmp函数来定义新的排序。我们先把限制时间按照从小到大的排序,看下时间超限了没有。没有就把修复时间放到优先队列中。如果超限了,就把队列的首元素(队列的最大整数)和超限的修复时间比较,大的话直接替换。可以想一想为什么可以直接替换。AC代码:
1 #include <iostream> 2 #include <queue> 3 #include <algorithm> 4 using namespace std; 5 const int N=150001; 6 struct mmp 7 { 8 int T1,T2; 9 }a[N]; 10 priority_queue <int> team; 11 bool cmp(mmp x,mmp y){return x.T2<y.T2;} 12 int main() 13 { 14 int n,t=0,g=0; 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 cin>>a[i].T1>>a[i].T2; 18 sort(a+1,a+n+1,cmp); 19 for(int i=1;i<=n;i++) 20 { 21 if(t+a[i].T1<=a[i].T2) 22 { 23 t+=a[i].T1; 24 g++; 25 team.push(a[i].T1); 26 } 27 else 28 { 29 if(team.top()>a[i].T1) 30 { 31 t=t-team.top()+a[i].T1; 32 team.pop(); 33 team.push(a[i].T1); 34 } 35 } 36 } 37 cout<<g<<endl; 38 }
时间: 2024-11-10 23:54:16