ZZULI 1895: 985的0-1串难题
2016-08-19 16:59
471 查看
1895: 985的0-1串难题 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 272 Solved: 81 SubmitStatusWeb BoardDescription 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 HINT Source hpu SubmitStatusWeb Board
经典的二分题目
先打个表记录下来前i个有多少个0
然后二分查找最大的长度 如果查找在那个片断0的个数小于k满足如果大于k肯定不满足了
#include <cstdio> #include <iostream> using namespace std; const int MAXX=100000+10; char sr[MAXX]; int n,k; int num[MAXX]; int init(){ int i=0; if(sr[0]=='0') num[0]=1; for(i=1;i<n;i++){ if(sr[i]=='0') num[i]=num[i-1]+1; else num[i]=num[i-1]; } } bool judge(int mid){ int i=0; int j=0; for( i=mid-1 ,j=0 ; i<n ; i++,j++){ int temp=0; if(sr[j]=='0') temp++; if(num[i]-num[j]+temp<=k) return true; } return false; } int main(){ int T; scanf("%d", &T); while( T-- ){ scanf("%d %d",&n,&k); scanf("%s",sr); init(); int l = 0, r = n; int mid=0; int ans=0; while(l <= r){ mid=( l + r ) >> 1; if( judge(mid) ){ ans=mid; l=mid+1; } else{ r=mid-1; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- zzuli 1895 (985的0-1串难题)
- ZZULIOJ/ 郑轻OJ 1895: 985的0-1串难题(数学思维)
- zzuli 1895: 985的0-1串难题(二分)
- 【zzuli-oj】-1895-985的0-1串难题(思维,好)
- zzuli 1895 985的0-1串难题
- 郑轻 oj 1895: 985的0-1串难题
- zzulioj1895: 985的0-1串难题(思维)
- 【zzuliOJ】1895 - 985的0-1串难题(思维)
- 【多校训练】ZZULIOJ 1895 985的0-1串难题
- zzuliOJ 1895: 985的0-1串难题 【二分】
- 【zzulioj 1895 985的0-1串难题】
- ZZuli oj 1895: 985的0-1串难题(二分+打表)
- 1895: 985的0-1串难题(好题)
- zzuli oj1895: 985的0-1串难题 [二分]
- 1895: 985的0-1串难题
- 1895: 985的0-1串难题
- 【郑轻】[1895]985的0-1串难题
- ZZULI OJ 1895: 985的0-1串难题
- zzuliOJ 1895:985的0-1串难题(二分+打表)
- zzuli 1899 985的最大和难题