1895: 985的0-1串难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 227 Solved: 62
Submit Status Web Board
Description
985有一个长度为n的0-1串,已知他最多可以修改k次(每次修改一个字符即0->1 或者 1->0),他想知道连续的全1子串最长是多少。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入两个整数n,k分别代笔上面的信息。
注:1 <= t <= 12,1 <= n <= 100000,0 <= k <= 100000。
Output
一个整数代表可以得到的最大长度。
Sample Input
2 6 3 010100 6 2 010100
Sample Output
5 4
每次得到一个mid是字符串的长度,mid长度的连续段中0的个数<=k,就说明合法。
代码:
#include<cstdio>
#include<cstring>
int t,n,k;
int sum[100000+10]; //记录第i个字符之前(包括i)0的个数
char str[100000+10];
int judge(int x)
{
for(int i=0;i<=n-x;i++)
{
int temp=0;
if(str[i]=='0')
temp=1;
if(sum[i+x-1]-sum[i]+temp<=k)
return 1;
}
return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&k);
scanf("%s",str);
if(str[0]=='0')//str[i]从0开始输入就是过不了,RE-->
sum[0]=1;
for(int i=1;i<n;i++)
{
if(str[i]=='0')
sum[i]=sum[i-1]+1;
else
sum[i]=sum[i-1];
}
int left=0,right=n,mid;
int ans=0,flag;
while(left<=right)
{
mid=(left+right)/2;
if(judge(mid))
{
ans=mid;
left=mid+1;
}
else
right=mid-1;
}
printf("%d\n",ans);
}
return 0;
}