P4053 [JSOI2007]建筑抢修
贪心
按照时间从前往后尽可能的修
如果能修就修,修不了的话
我们可以选择撤掉一个以前修的腾出时间来,但是,腾出两个显然更蠢
那么,显然无论腾不腾,截止到此建筑,能修的数量最多一定()
由此观之,应该把已修的最大的取出来,然后进行比较,放进小的,扔掉大的,来为后面腾时间
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue <long long >q ;
long long n;
struct bu{
long long ne;
long long boom;
}buil[150001];
bool cmp(bu x,bu y){
if(x.boom==y.boom)
return x.ne<y.ne;
return x.boom<y.boom;
}
long long now;
long long s;
int main(){
scanf("%lld",&n);
for(long long i=1;i<=n;++i){
scanf("%lld%lld",&buil[i].ne,&buil[i].boom);
}
sort(buil+1,buil+n+1,cmp);
for(long long i=1;i<=n;++i){
if(buil[i].ne+now<=buil[i].boom){
q.push(buil[i].ne);
now+=buil[i].ne;
s++;
continue;
}else{
if(!q.empty()){
if(q.top()>buil[i].ne){
now=now+buil[i].ne-q.top();
q.pop();
q.push(buil[i].ne);
}else{
continue;
}
}
}
}
cout<<s;
return 0;
}