链接:http://poj.org/problem?id=3061


尺取法,《挑战程序设计竞赛》P146

从第一个数字开始,向后扫描。直到sum>=S为止,计算出长度,再从第二个数字开始,直到sum>=S,,计算出长度....

扫描过一遍后,取最小值即可


#include <iostream>
#include<cstdio>
using namespace std;
#define MAX_N 100000
int data[MAX_N];
int N,S;
void solve()
{
    int ans=N+1;
    int s=0,t=0,sum=0;
    for(;;)
    {
        while(t<N&&sum<S)
            sum+=data[t++];
        if(sum<S)
            break;
        ans=min(ans,t-s);
        sum-=data[s++];

    }
    if(ans>N)
        ans=0;
    cout<<ans<<endl;

}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>N>>S;
        for(int i=0;i<N;i++)
            scanf("%d",&data[i]);
        solve();

    }
    return 0;
}