Subsequence POJ 3061(尺取)

原题

题目链接

题目分析

依题意可以用尺取法,设区间[s,t]内的数的合为sum,当sum=S,此时更新答案,在把s往右延伸,再重复操作.当s,t遍历完整个区间时遍得到答案,复杂度为O(n).

代码

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 #include 
 9 #include <string>
10 #include 
11 #include 
12 #include 
13 #include <set>
14 #include 
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)
37             scanf("%d",&num[i]),sum+=num[i];
38         if(sum"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(sum1) sum+=num[++t];
47                 if(sumbreak;
48                 ans=min(ans,t-s+1);
49                 sum-=num[s++];
50             }
51             printf("%d\n",ans);
52         }
53     }
54     return 0;
55 }

 

你可能感兴趣的:(Subsequence POJ 3061(尺取))