题意:给你一个长度为n(n<100000)的数组,让你找到一个最短的连续子序列,使得子序列的和>=m (m<1e9)
ac代码1:(尺取法)
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int sum[100005];
int main()
{int T,n,S;cin>>T;while(T--){cin>>n>>S;int t=0,s=0,ans=n+100,sum=0; for(int i=0;i<n;i++) cin>>a[i];while(1){ while(t<n&&sum<S){sum+=a[t];t++;}if(sum<S) break;ans=min(ans,t-s);sum-=a[s++]; }if(ans==n+100)cout<<0<<endl;elsecout<<ans<<endl; }return 0;
}
ac代码2:(前缀和+二分)
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
using namespace std;
int a[100005];
int sum[100005];
int main()
{int t,n,s;cin>>t;while(t--){int o,e,MAX=999999;sum[0]=0;scanf("%d%d",&n,&s);for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}if(sum[n]<s) printf("0\n");else{for(int i=1;sum[i]+s<sum[n];i++){int l=lower_bound(sum+i,sum+n,sum[i]+s)-sum;MAX=min(MAX,l-i);}printf("%d\n",MAX);}}return 0;}