• POJ_3061_Subsequence_(尺取法)


    描述


    http://poj.org/problem?id=3061

    给定长度为n的数列整数以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0.

    Subsequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11604   Accepted: 4844

    Description

    A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.

    Input

    The first line is the number of test cases. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.

    Output

    For each the case the program has to print the result on separate line of the output file.if no answer, print 0.

    Sample Input

    2
    10 15
    5 1 3 5 10 7 4 9 2 8
    5 11
    1 2 3 4 5

    Sample Output

    2
    3

    Source

    分析


    尺取法.

    定义区间左右端点l和r.l从1开始循环到n,r向后移动,直到区间和>=s,此时为左端点为l时的最短长度.对于左端点为l+1的情况,使得区间和>s的右端点一定>=r,就让r右移直到满足条件.如果r=n仍无法满足,那对于之后的l都无法满足,即可break.此题用二分O(nlogn),用尺取法O(n).

    p.s.

    1.此题还可用二分做,复杂度为O(nlogn).

     1 #include<cstdio>
     2 #include<algorithm>
     3 using std :: min;
     4 
     5 const int maxn=100005;
     6 int q,n,s;
     7 int a[maxn];
     8 
     9 void solve(int n,int s)
    10 {
    11     int ans=n+1;
    12     int r=1,sum=0;
    13     for(int l=1;l<=n;l++)
    14     {
    15         while(r<=n&&sum<s)
    16         {
    17             sum+=a[r++];
    18         }
    19         if(sum<s) break;
    20         ans=min(ans,r-l);
    21         sum-=a[l];
    22     }
    23     if(ans>n) ans=0;
    24     printf("%d
    ",ans);
    25 }
    26 
    27 void init()
    28 {
    29     scanf("%d",&q);
    30     while(q--)
    31     {
    32         scanf("%d%d",&n,&s);
    33         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    34         solve(n,s);
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     freopen("Subsequence.in","r",stdin);
    41     freopen("Subsequence.out","w",stdout);
    42     init();
    43     fclose(stdin);
    44     fclose(stdout);
    45     return 0;
    46 }
    View Code

     

  • 相关阅读:
    检测数组和对象&扩展String.prototype.format 字符串拼接的功能
    10000以内unicode对照表
    手机页面加载完成后再显示(粗糙版)
    手机端网页 横竖屏翻转事件
    代替eval的方法
    跨域和非跨域 获取iframe页面高度的方法
    HDU2032 杨辉三角
    HDU2030 汉字统计
    POJ 2029 Palindromes _easy version
    POJ3468 A Simple Problem with Integers
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5423215.html
Copyright © 2020-2023  润新知