bzoj 1029
经典贪心题。
先按照t2从小到大sort一遍。
设ans为前i个中最多选几个。
now为选ans个的情况下最少花费的时间。
用大根堆维护ans个中消耗时间最长的值。
如果可以直接选就直接选。把消耗的时间加到now中,把消耗的时间放进堆里。
否则如果消耗的时间比ans个中消耗时间最长的值小就把那个最大的“退掉”,然后选这个。
#include<cstdio> #include<cctype> #include<queue> #include<algorithm> using namespace std; const int maxn=150000; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } struct bdg{ int t1,t2; }b[maxn]; priority_queue<int> q; int cmp(bdg x,bdg y){ return x.t2<y.t2; } int main(){ int n=read(),ans=0; for(int i=0;i<n;i+=1) b[i].t1=read(),b[i].t2=read(); sort(b,b+n,cmp); int now=0; for(int i=0;i<n;i+=1) if(now+b[i].t1<=b[i].t2) ans++,now+=b[i].t1,q.push(b[i].t1); else if(b[i].t1<q.top()) now-=q.top()-b[i].t1,q.pop(),q.push(b[i].t1); printf("%d",ans); return 0; }