链接: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; }
天下武功,唯快不破