zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    C++ Low level performance optimize
    简单find命令的实现
    数据结构学习之栈
    随机数的生成
    数据结构学习(一)
    C复习---动态内存分配
    (转)虚拟文件系统(VFS)浅析
    (转) 中断处理程序&中断服务例程
    Gradle系列教程之依赖管理
    Gradle系列教程之依赖管理
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5423215.html
Copyright © 2011-2022 走看看