题意:给你一个长度为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;
else
cout<<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;
}