给定长度为n的整数数列
输入
n = 10
S = 15
a = {5 , 1,3 ,5 ,10,7,4,9,2,8}
输出
2 (5 ,10)
尺取法通常的是保留数组的一对下标(开始到结束),然后根据实际情况交替移动。
我们假设从i开始总和超过S的连续子序列如果为
即
画图说明一下可能更形象,以样例输入为例子:
1.初始化的时候,开始指针和结束指针都指向第一个,此时的子序列和为
2. 向右移动结束指针,当移到10位置,第一次出现
3.这时移动开始的指针,先向右移动一格
4.继续移动开始的指针,当移动到10的时候,
5,然后不断重复上面的步骤,找出最短的一个就是该问题的解
#include <iostream>
using namespace std;
int main(){
int n,S;
cout<<"n = ";
cin>>n;
cout<<"S = ";
cin>>S;
int *a = new int[n];
cout<<"input a[] :";
for(int i=0;i<n;i++){
cin>>a[i];
}
int b=0,e=0,sum=0,res=n+1;
while(1){
//移动结束的下标
while(e < n && sum < S){
sum+=a[e++];
}
if(sum < S) break;
//移动开始的下标
while(sum >= S){
sum-=a[b++];
}
res=min(res,e-b+1);
}
if(res>n){
res=0;
}
cout<<res<<endl;
}
n = 5
S = 11
input a[] :1 2 3 4 5
3
原文地址:http://blog.csdn.net/lizo_is_me/article/details/43794745