$[JSOI2007]$建筑抢修

Posted 风骨傲天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$[JSOI2007]$建筑抢修相关的知识,希望对你有一定的参考价值。

([JSOI2007])建筑抢修

贪心,不多讲,就是贪心。

第一反应肯定是按照报废时间排序,但是我们可以轻而易举的早出反例(留给读者自造,想一想,不难造)

那么我们考虑优化贪心思想。

按照报废时间从小到大修,如果有一个会爆掉就从已经修好的中间找一个修理时间最长的不修,改修当前这个。

用优先队列维护一下当前修过的即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
    int f=1,w=0;char x=0;
    while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
    while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
    return w*f;
}
const int N=2e5+10;
int n,ST,Cnt;
struct Build
{
    int T,Lim;
    inline bool operator < (const Build y) const
        {
            return T<y.T;
        }
} p[N];
priority_queue<Build> Q;
inline bool Cmp(Build x,Build y) {return x.Lim<y.Lim;}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("A.in","r",stdin);
#endif
    n=read();
    for(int i=1;i<=n;i++) p[i].T=read(),p[i].Lim=read();
    sort(p+1,p+n+1,Cmp);
    for(int i=1;i<=n;i++)
        if(ST+p[i].T>p[i].Lim)
        {
            if(p[i].T<Q.top().T)
                ST=ST-Q.top().T+p[i].T,Q.pop(),Q.push(p[i]);
        }
        else Q.push(p[i]),Cnt++,ST+=p[i].T;
    printf("%lld
",Cnt);
}

以上是关于$[JSOI2007]$建筑抢修的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1029: [JSOI2007]建筑抢修 贪心

[JSOI2007]建筑抢修

[JSOI2007]建筑抢修

[BZOJ1029][JSOI2007]建筑抢修

「JSOI2007」建筑抢修

BZOJ-1029: [JSOI2007]建筑抢修(贪心+堆优化)