zoukankan      html  css  js  c++  java
  • http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1895 二分

    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
     
     
    重新的理解了 二分函数   感觉挺重要的    光为了理解那个函数的意思就编译了好久   不过最后还是  写了出来
    q=upper_bound(sum,sum+len,sum[i]-s+n)-sum; 好比(1,2,2,4) upper_bound(2)==3;3表示的是下标  也就是数字4的位置
    q=lower_bound(sum,sum+len,sum[i]-s+n)-sum;好比(1,2,2,4) lower_bound(2)==1;1表示的是下标  也就是第一个数字2的位置
    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<math.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define N 102311
    int sum[N],dp[N];
    char str[N];
    int main()
    {
        /*int a[123]={1,1,1,2,2,2,3,4};写这些主要是为了编译二分函数  
        int n=8,w;
        while(scanf("%d",&w)!=EOF)
        {
             int q=upper_bound(a,a+n,w)-a;
             printf("%d
    ",q);
        }*/
        int T,len,n;
        scanf("%d",&T);
        while(T--)
        {
            sum[0]=0;
            scanf("%d%d%s",&len,&n,str);
            for(int i=0;i<len;i++)
            {
                if(i==0)
                {
                    if(str[i]=='0')
                        sum[i]=1;
                    else
                        sum[i]=0;
                    continue;
                }
                if(str[i]=='0')
                    sum[i]=sum[i-1]+1;
                else
                    sum[i]=sum[i-1];
            }
            int ans=0;
            for(int i=0;i<len;i++)
            {
                int s;
                if(str[i]=='0')
                    s=1;
                else s=0;
                int q=upper_bound(sum,sum+len,sum[i]-s+n)-sum;
                dp[i]=q-i;
                ans=max(ans,dp[i]);
                ///printf("%d
    ",dp[i]);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    【】130个好的资源网站
    c++输出控制字体颜色
    【】程序员经典面试题
    c语言链表——模拟链表
    c语言链表——链表
    一些Markdown编辑器
    【】如何评价Github发布的文本编辑器atom?
    遍历简单XML节点
    jQuery重要插件!
    nvarchar与varchar的区别
  • 原文地址:https://www.cnblogs.com/a719525932/p/5735634.html
Copyright © 2011-2022 走看看