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;
}

 

posted @ 2017-10-22 20:37  或是七一  阅读(77)  评论(0编辑  收藏  举报