题解 CF2042C
HYdroKomide · · 题解
题意:
给一个 0-1 串分段,每段内元素的分数从左到右递增,问使得位置为
思路:
算是一道有些反直觉的题目,一眼让人容易想到直接给序列本身分段,陷入错误循环。实际上得到正解只需要注意到一个结论:在某个位置
证明也不难,在
只需从后往前枚举断点并且算出所有
举个例子,考虑样例中
程序如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int T,n,k,a[N];
char str[N];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%s",&n,&k,str+1);
int cnt0=0,cnt1=0;
for(int i=n;i>=1;i--){
if(str[i]=='0')cnt0++;
else cnt1++;
a[i]=cnt1-cnt0;//对于每个位置求它的贡献
}
sort(a+2,a+n+1);//排序,注意不能包含首项
long long sum=0,ans=1;
bool flag=true;
for(int i=n;i>1;i--){
if(a[i]<=0){
flag=false;
break;
}
sum+=a[i],ans++;
if(sum>=k)break;
}
if(!flag||sum<k)printf("-1\n");
else printf("%d\n",ans);
}
}