题意:给定长度为n的数列整数a0,a2,…an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
解题方法:
用复杂度为O(n*log(n))的做法即用二分法。每一次从头到尾先定顶点,再找到从该顶点开始和大于等于S的位置,再确定最小值。本题可以有复杂度更低的尺取法来做。
话不多说上代码。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+6;
int S,a[N],sum[N],n;
void solve(){
if(sum[n]<S){cout<<0<<endl;return ;}
int res=n;
for(int s=0;sum[s]+S<=sum[n];s++){
int t=lower_bound(sum+s,sum+n,sum[s]+S)-sum;
res=min(t-s,res);
}
cout<<res<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int T;cin>>T;
while(T--){
cin>>n>>S;for(int i=0;i<n;i++)cin>>a[i],sum[i+1]=sum[i]+a[i];
solve();
}
}