ZZULI 1895: 985的0-1串难题

来源:互联网 发布:xp网络共享设置 编辑:程序博客网 时间:2024/04/29 15:53
1895: 985的0-1串难题Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 272  Solved: 81SubmitStatusWeb BoardDescription985有一个长度为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 Input26 30101006 2010100Sample Output54HINTSourcehpuSubmitStatusWeb 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; }  
0 0