zoukankan      html  css  js  c++  java
  • 毛毛虫——尺取算法

    何为尺取算法呢?我觉得成为毛毛虫算法更为贴切,因为这个算法操作对象是一个序列,算法过程好像一个毛毛虫有伸缩也有前进,就好比这样:

    。。。。。。额,妹子已经给我们很好的演示了这个算法的过程了。

    下面以一个题目为例来演示一下:

    Poj3061

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

    输入

    n = 10,m = 15

    5 1 3 5 10 7 4 9 2 8

    输出

    2

    过程大致分为四步:

    1.初始化左右端点,即先找到一个满足条件的序列。

    2.在满足条件的基础上不断扩大右端点。

    3.如果第二步无法满足条件则终止,否则更新结果。

    4.扩大左端点,并且回到第二步。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 int main()
     5 {
     6     int t,n,m,ans,minx,sum,i,j,w;
     7     int a[10010];
     8     scanf("%d",&t);
     9     while(t--)
    10     {
    11         scanf("%d%d",&n,&m);
    12         for(i=0;i<n;i++)
    13         {
    14             scanf("%d",&a[i]);
    15         }
    16         j=0;
    17         w=0;
    18         sum=0;
    19         ans=n+1;
    20         while(1)
    21         {
    22             while(j<n&&sum<m)
    23             {
    24                 sum=sum+a[j++];///先找到一个满足条件的序列,在满足条件的基础上不断扩大右端点
    25             }
    26             if(sum<m)
    27             {
    28                 break;
    29             }
    30             minx=j-w;
    31             ans=min(ans,minx);
    32             sum=sum-a[w];///扩大左端点
    33             w++;
    34         }
    35         if(ans==n+1)
    36         {
    37             printf("-1
    ");
    38         }
    39         else
    40         {
    41             printf("%d
    ",ans);
    42         }
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    学会用google吧,,,
    HDU 2120 Ice_cream's world I
    ZOJ 3471 Most Powerful (状压DP)
    POJ 2192 Zipper
    我的闪存汇总
    Python For Delphi更好地协同(续)
    Python For Delphi更好地协同
    官方的正则表达式组件 RegularExpressions : 基本应用(转自万一博客)
    Thread: DataSnap detect disgraceful disconnect
    window7下安装IPython
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9016281.html
Copyright © 2011-2022 走看看