贪心,按时间限制排序,记录当前维修需要的时间;
1.当前时间+这个建筑物维修需要的时间<=当前限制 ans++ 因为这个建筑的限制度后面没有影响,不选一定不会更优秀 //保证所有答案均符合要求
2.当前时间+这个建筑物维修需要的时间<=当前限制 :a。当前维修时间比之前一个小,更新之前的情况
b。更大 ,扔掉不管
这样,即保证解满足要求,同时使得维修时间最少
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
#define maxn 150020
using namespace std;
int n;
struct node{
int t,limit;
bool operator < (const node& b)const {return limit<b.limit ; }
}nod[maxn];
priority_queue<int>q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&nod[i].t,&nod[i].limit);
}
sort(nod+1,nod+1+n);
int now=nod[1].t,ans=1;
q.push(nod[1].t );
for(int i=2;i<=n;i++){
if(now+nod[i].t<=nod[i].limit){
q.push(nod[i].t);
now+=nod[i].t;ans++;
}else{
int u=q.top();
if(u>nod[i].t){
q.pop();
q.push(nod[i].t);
now=now-u+nod[i].t;
}
}
}
printf("%d",ans);
return 0;
}