Competitive Fishing

题目链接:https://codeforces.com/contest/2042/problem/C

题意:

给定一个01串,其中1属于bob,0属于alice

可以划分m个连续区间,使得m个区间的权值依次为递增的自然数

求让bob的权值大于alice的权值至少为k需要划分最少的区间

思路:

偶遇神秘贪心题

划分一个连续区间相当于在数中间加一个隔板。发现每加一个隔板,会使隔板后面的数的权值加一倍

若将0视为-1,那么相当于让答案加上 隔板后的第一个数至最后一个数的区间之和(后缀和)

为了使答案快速增大,排序后缀和,从大的开始累加即可

隔板不能加在第一个数的左边

注意,后缀和的累加是独立的,即隔板不需要有顺序的依次放

void solve(){
    int n,k;cin>>n>>k;
    string s;cin>>s;s=" "+s;
    vector<pii>suf(n+2);
    rep(i,1,n)suf[i].se=i;
    for(int i=n;i>=1;i--){
        suf[i].fi=suf[i+1].fi+(s[i]=='1'?1:-1);
    }
    sort(suf.begin()+1,suf.end(),greater<pii>());
    int ans=0;
    int cnt=1;
    rep(i,1,n){
        if(suf[i].se==1)continue;
        ans+=(suf[i].fi);
        cnt++;
        if(ans>=k)break;   
    }
    if(ans<k)cout<<-1<<endl;
    else cout<<cnt<<endl;
}

posted @ 2025-05-11 17:21  Marinaco  阅读(13)  评论(0)    收藏  举报
//雪花飘落效果