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 }

 

posted @ 2019-10-23 20:51  VBL  阅读(123)  评论(0编辑  收藏  举报