4.4 建筑抢修(利用堆维护的贪心)
题目链接
题目思路
和会议问题相似,先把结束时间从小到大排序,再用最大堆维护,比较前面维修所需时间与后面所需维修时间,从而实现贪心最大化
代码实现
#include<bits/stdc++.h> using namespace std; const int Max=1e6; struct node{ int t1,t2; }a[Max]; priority_queue<int,vector<int>,less<int> >q; bool cmp(node a,node b) { if(a.t2==b.t2) return a.t1<b.t1; else return a.t2<b.t2; } int n; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i].t1>>a[i].t2; sort(a+1,a+n+1,cmp); int time=0; for(int i=1;i<=n;i++) { if(time+a[i].t1<=a[i].t2) { time+=a[i].t1; q.push(a[i].t1); } else { if(a[i].t1<q.top()) { time=(time-q.top()+a[i].t1); q.pop(); q.push(a[i].t1); } } } cout<<q.size()<<endl; return 0; }