zzuliOJ 1895:985的0-1串难题(二分+打表)
2016-08-09 16:08
399 查看
1895: 985的0-1串难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 203 Solved: 54
SubmitStatusWeb
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 010100Sample Output
5 4HINT
Source
hpu解题思路:扫描字符串打表,biao[i]代表第i个字符(包括第i个)前面有多少个0(扫0是因为要将0变成全1的序列).然后二分法看每个长度为mid的子串里0的个数是否小于等于k(最多可以修改k次,那么少于k次也是可以的,之前只写了写等于,wa了好几次。。)
代码如下:
#include <cstdio> #include <cstring> char s[100010]; int biao[100010];//储存前i个0的个数 int n,k; void dabiao() { memset(biao,0,sizeof(biao)); if(s[0]=='0') { biao[0]=1; } for(int i=1;i<n;i++) { if(s[i]=='0') { biao[i]=biao[i-1]+1; } else { biao[i]=biao[i-1]; } } } bool judge(int x) { int size=n-x; for(int i=0;i<=size;i++) { int tmp=0; if(s[i]=='0')//这里 举个例子如 010100 首尾是4-1+1=4 010101 首尾是3-1+1=3 110100 首尾是3-0=3 即如果第i个是0的话 ,那么多减了第i个,那么+1来弥补 { tmp++; } if(biao[i+x-1]-biao[i]+tmp<=k)//最多可以修改k次,那么少于k次也是可以的,之前只写了写等于,wa了好几次。。 { return true; } } return false; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); scanf("%s",s); dabiao(); int l=1,r=n; int ans,mid; while(l<=r) { mid=(l+r)/2; if(judge(mid)) { ans=mid; l=mid+1; } else { r=mid-1; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- zzuliOJ 1895: 985的0-1串难题 【二分】
- ZZuli oj 1895: 985的0-1串难题(二分+打表)
- 【zzuliOJ】1895 - 985的0-1串难题(思维)
- 【多校训练】ZZULIOJ 1895 985的0-1串难题
- zzulioj1895: 985的0-1串难题(思维)
- zzuli 1895: 985的0-1串难题(二分)
- zzuli oj1895: 985的0-1串难题 [二分]
- 【zzulioj 1895 985的0-1串难题】
- ZZULI OJ 1895: 985的0-1串难题
- 1895: 985的0-1串难题
- 郑轻 oj 1895: 985的0-1串难题
- 1895: 985的0-1串难题(好题)
- 1895: 985的0-1串难题
- ZZULIOJ/ 郑轻OJ 1895: 985的0-1串难题(数学思维)
- zzuli 1895 985的0-1串难题
- zzuli 1895 (985的0-1串难题)
- ZZULI 1895: 985的0-1串难题
- 【郑轻】[1895]985的0-1串难题
- 【zzuli-oj】-1895-985的0-1串难题(思维,好)
- ZZULIOJ-1896-985的买饮料难题(水题)