原题
题意
给出了n个正整数序列(10<n<100,000),它们均小于或等于10000,正整数s(s<100 000 000)。编写一个程序来查找序列的连续元素的子序列的最小长度,其总和大于或等于S。没有答案输出 0 。
Input
2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
Output
2
3
解题思路:
从左向右依次遍历,当和大于 S 时,减去最左边的数,判断 和 S的大小,
如果还大,左边的向右,
如果小,右边的向右。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int a[maxn];
int main(){
int n,s,x;
scanf("%d",&x);
while(x--){
scanf("%d%d",&n,&s);
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
int sum = 0;
int answer = 10000000;
int l = 0;
int r = 0;
while(1){
while(r < n && sum < s){ //当还没有遍历完并且 sum 小于 S 时,右边向右走
sum += a[r];
r++;
}
if(sum < s){ // 当遍历完并且 sum 小于 s ,退出
break;
}
answer = min(answer,r-l); //选取最小的 答案
if(sum >= s){ // sum 大于 s 时,sum - 最左边的数,
sum -= a[l];
l++; //左边向左走
}
}
if(answer > n){
answer = 0;
}
printf("%d\n",answer);
}
return 0;
}