Subsequence (后继,随后) 尺取法

原题    

        Subsequence

题意

       给出了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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值