题意:
有n个建筑需要修理,修理需要时间,如果在限制时间里没有修理完成,就报废了。问最多能够修理多少个建筑。
思路:
贪心。先按时间限制从小到大排序,对于某个建筑,不能修理的话就跟之前修理并且修理花费时间最长比较,如果前者花费时间小,就将后者移除。
维护修理花费时间可以用堆维护。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+7; struct node{ ll t1,t2; bool operator < (const node &a)const{ return t2<a.t2; } }a[maxn]; int main(){ int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i].t1>>a[i].t2; sort(a+1,a+1+n); int res=0,sum=0; priority_queue<int>q; for(int i=1;i<=n;i++){ if(sum+a[i].t1<=a[i].t2){ res++; sum+=a[i].t1; q.push(a[i].t1); } else{ if(q.top()>a[i].t1){///不判断队列是否为空也可以AC sum=sum-q.top()+a[i].t1; q.pop(); q.push(a[i].t1); } } } cout<<res<<endl; return 0; }