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

浙公网安备 33010602011771号