zoukankan      html  css  js  c++  java
  • 尺取

    这种方法用于,需要在给的一组数据中找到不大于某个上限的“最优连续子序列”
    poj 3061题

    给长度为N的数组和一个整数S,求总和不小于S的连续子序列的最小长度

    输入
    N=10,S=15
    5 1 3 5 10 7 4 9 2 8

    输出
    2

    这道题的思路是下图这样的

    尺取

    定义L,R都存数组第一个元素下标
    然后R开始递增,且sum+=a[R];直到sum>=S,
    记下这个子序列的长度R-L
    然后在这个子序列和基础上减去这个子序列的第一个元素
    形成一个新的子序列
    再判断新的子序列和满不满足>=S,
    如果满足再减去第一个元素,形成一个新的子序列
    如果不满足则往后加一个新元素,直到子序列和满足sum>=S为止

    如果遇到求子序列和一直加到数组最后一个元素还是不满足sum>=S
    就可以break跳出循环

    下面是poj 3061 AC代码

    #include <stdio.h>
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            int a[100000]={0},N,S,i;
            int L,R,sum,d=100001;//L是区间左边下标,R是区间右边下标,d是最短序列长度
            scanf("%d%d",&N,&S);
            for(i=0;i<N;i++)
                scanf("%d",&a[i]);
            sum=L=R=0;
            while(1)
            {
                while(sum<S&&R<N)
                    sum+=a[R++];
                if(sum<S)
                    break;
                d=d<(R-L)?d:(R-L);//R-L是每次满足的序列长度
                sum-=a[L++];
            }
            if(d>N)
                d=0;
            printf("%d
    ",d);
        }
        return 0;
    }
    
  • 相关阅读:
    求超大文件上传方案( vue )
    求超大文件上传方案( csharp )
    求超大文件上传方案( c# )
    求超大文件上传方案( .net )
    求超大文件上传方案( asp.net )
    求超大文件上传方案( php )
    求超大文件上传方案( jsp )
    用浏览器 实现断点续传 (HTTP)
    shuffle() 函数
    no.random.randn
  • 原文地址:https://www.cnblogs.com/yanhua-tj/p/13996592.html
Copyright © 2011-2022 走看看