链接: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;
}
天下武功,唯快不破
浙公网安备 33010602011771号