看了一个尺取法的小妙题,来自《挑战程序设计竞赛》
题目:给定长度为n的整数序列a0,a1,...,an-1以及整数S.求出总和不小于S的连续子序列的长度的最小值。不存在则输出零
样例1:
n=10
s=15
a={5,1,3,5,10,7,4,9,2,8}
输出:
2(5+10)
int n,s;
int a[MAX_N]
int sum{MAX_N+1]
void solve(){
//计算sum
for(int i=0;i<n;i++){
sum[i+1]=sum[i]+a[i];
}
if(sum[n] < S){
//解不存在
cout<<"0"<<endl;
return;
}
int res=n;
for(int s=0;;sum[s]+S<=sum[n];s++){
//利用二分搜索求出t
int t=lower_bound(sum+s,sum+n,sum(s)+S)-sum;
res=min(res,t-s);
}
cout<<res<<endl;
}