很菜,比赛时题意理解错了。。。。。
完了后看了下高手的代码,恍然大悟
继续加油喽
---------------------------------------------------------------------------------------------
三种情况讨论即可:
1.在前导1跟后导1中取个最大的,然后在中间取到最多的
2.前面后面都要,中间取最多
3.前面后面都不要,只在中间取最多
ac代码:
#include<bits/stdc++.h>
using namespace std;
int N,K,M;
char S[10005];
int A[10005];
int main(){
int i,l,r,now;
while(~scanf("%d%d",&N,&K)){
scanf("%s",S+1);
for(i=1;i<=N&&S[i]=='1';i++);
if(!K||i>N){
printf("%d\n",i-1);
continue;
}
l=i-1;
for(i=N;i&&S[i]=='1';i--);
r=N-i;
now=0;
M=0;
for(i=1;i<=N;i++)A[i]=0;
for(i=l+1;i<=N-r;i++)
if(S[i]=='1')
now++;
else if(now)
A[++M]=now,now=0;
sort(A+1,A+M+1,greater<int>());
for(i=1;i<=N;i++)
A[i]+=A[i-1];
printf("%d\n",max(max(l,r)+A[K>>1],max(l+r+A[K-1>>1],A[K+1>>1])));
/*比赛公告最后说不能翻转,其实跟max(l,r)+A[K>>1]跟反转来说没什么区别,原因是
比如:11011101110111 砍4刀
刚开始我也想的是110*111*0*111*0111这样砍(*为砍的地方)
仔细想想 110*111*0*1110*111 这样砍不就更划算吗。
*/
//k+1,对于偶数k来说没什么区别,对于奇数k来说,
//如:110110111011 砍三刀,00*11*0*111000 跟4刀 00*11*0*111*000 效果一样,加一为了方便计算。
}
return 0;
}