毛毛蟲——尺取算法


何為尺取算法呢?我覺得成為毛毛蟲算法更為貼切,因為這個算法操作對象是一個序列,算法過程好像一個毛毛蟲有伸縮也有前進,就好比這樣:

。。。。。。額,妹子已經給我們很好的演示了這個算法的過程了。

下面以一個題目為例來演示一下:

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\n");
38         }
39         else
40         {
41             printf("%d\n",ans);
42         }
43     }
44     return 0;
45 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM