Subsequence POJ 3061(尺取)
原题
题目分析
依题意可以用尺取法,设区间[s,t]内的数的合为sum,当sum<S的时候,t往右延伸直到sum>=S,此时更新答案,在把s往右延伸,再重复操作.当s,t遍历完整个区间时遍得到答案,复杂度为O(n).
代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <utility> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <stack> 11 #include <queue> 12 #include <vector> 13 #include <set> 14 #include <map> 15 16 using namespace std; 17 typedef unsigned long long ULL; 18 typedef long long LL; 19 typedef long double LB; 20 const int INF_INT=0x3f3f3f3f; 21 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 22 23 int num[100000]; 24 25 int main() 26 { 27 // freopen("testdata.in","r",stdin); 28 // freopen("std.out","w",stdout); 29 int T; 30 cin>>T; 31 while(T--) 32 { 33 int N,S; 34 cin>>N>>S; 35 LL sum=0; 36 for(int i=0;i<N;i++) 37 scanf("%d",&num[i]),sum+=num[i]; 38 if(sum<S) printf("0\n"); 39 else 40 { 41 int s=0,t=0; 42 sum=num[0]; 43 int ans=INF_INT; 44 while(true) 45 { 46 while(sum<S&&t<N-1) sum+=num[++t]; 47 if(sum<S) break; 48 ans=min(ans,t-s+1); 49 sum-=num[s++]; 50 } 51 printf("%d\n",ans); 52 } 53 } 54 return 0; 55 }