菜鸡的切题记录

以后做的水题都会在这里发布

jzoj1443. 最小最大和

容易想到如下贪心策略:

将2个序列排序,每一次从a序列取头,b序列取尾,再将a序列的头和b序列的尾删除

但是这样子在n<=100000的情况下会tle

注意到所有数的权值<=100,于是使用桶记录即可

ps:因为一个睿智错误调了好久

#include<bits/stdc++.h>
using namespace std;
int x,y,a[110],b[110],n;
int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&x,&y);
        a[x]++;b[y]++;
        int s=0,r=101,rs=0,ans=0;
        for(int i=1;i<=100;i++){
            if(!a[i])continue;
            s+=a[i];
            if(rs>=s){
                if(b[r])ans=max(ans,i+r);
                continue;
            }
            while(r&&rs<s){
                if(b[r]&&s-a[i]<rs)ans=max(ans,i+r);
                r--;
                rs+=b[r];
            }
            if(b[r])ans=max(ans,i+r);
        }
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自www.cnblogs.com/rilisoft/p/10945388.html