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

     

  • 相关阅读:
    收藏的博客
    MVC 之 System.Web.Optimization找不到引用
    SQL Server 之 附加数据库出现“ 拒绝访问 ”
    Android Studio 之 环境搭建
    PD 之 连接数据库并导出数据及生成PDM文件
    Windows 之 可以Ping通服务器但无法使用服务器连接的共享打印机
    JQuery 之 在数据加载完成后才自动执行函数
    JavaScript 之 动态加载JS代码或JS文件
    JQuery 之 动态加载JS或JS文件
    JavaScript 之 解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5423215.html
Copyright © 2011-2022 走看看