LA 2678 Subsequence

利用单调性求最短连续子序列的和大于等于s;

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define maxn 100009
 5 using namespace std;
 6 
 7 int sum[maxn];
 8 int main()
 9 {
10     int n,s,x;
11     while(scanf("%d%d",&n,&s)!=EOF)
12     {
13         memset(sum,0,sizeof sum);
14         int ans=n+1;
15         for(int i=1;i<=n;i++)
16         {
17             scanf("%d",&x);
18             sum[i]=sum[i-1]+x;
19         }
20         int j=1;
21         for(int i=1;i<=n;i++)
22         {
23             if(sum[j-1]>sum[i]-s)continue;
24             while(sum[j]<=sum[i]-s)j++;
25             ans=min(ans,i-j+1);
26         }
27         printf("%d
",ans==n+1?0:ans);
28     }
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3423708.html