题意:给一个维修时间和一个报废的截至时间,然后有很多个,现在问最多抢救多少个
这个题和每日一题第一次的那个题有点像:https://ac.nowcoder.com/discuss/390428
然后回来说这个题.
贪心:先修最先报废的那几个,再修后面的,然后可以用优先队列来实现
然后对于修了x个建筑可能需要t秒,但是对于第y个建筑而言如果把修的x个建筑中的一个不修而修第y个,所需要的时间会小于t,此时有一个状态,即把第y个当x+1来修,还没修完第y个就报废了
所以这用到优先队列
每次返回x个里面消耗时间最多的,与第y个比较,看看那一个所需要的时间比较少
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node{ ll x; ll y; } n[150005]; bool cmp(node a,node b){ return a.y<b.y; } priority_queue<ll> q; int ans,t; int main(){ int m; cin>>m; for(int i=0;i<m;i++){ scanf("%lld %lld",&n[i].x,&n[i].y); } sort(n,n+m,cmp); for(int i=0;i<m;i++){ if(t+n[i].x<=n[i].y){ t=t+n[i].x; q.push(n[i].x); } else{ if(n[i].x<q.top()){ t=t-q.top()+n[i].x; q.pop(); q.push(n[i].x); } } } cout<<q.size()<<endl; return 0; }