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

     

  • 相关阅读:
    安卓数据存储(3):SQLite数据库存储
    安卓活动间的传值问题
    JavaScript、jQuery获取radio、checkbox选中的值
    无法连接到VSS资源数据库
    JQuery自定义搜索控件
    UIAlertView使用
    Xcode使用git管理版本
    达乐居视频网前台页面的总结
    Spark环境搭建遇到的问题
    在IE中启动火狐——自定义浏览器链接协议
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5423215.html
Copyright © 2011-2022 走看看