原题
题意
给出了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;
}
解决一个给定序列中寻找连续子序列使其总和大于或等于特定值的问题,通过双指针技术实现高效算法。
 尺取法&spm=1001.2101.3001.5002&articleId=81267703&d=1&t=3&u=09b0e7ef78a94ddb86826687633a80d5)
1048

被折叠的 条评论
为什么被折叠?



