POJ No.3061-Subsequence(连续子序列)

来源:互联网 发布:淘宝上最帅的男模特 编辑:程序博客网 时间:2024/06/01 21:56

尺取法

(尺取法通常是指对数组保存一对下标(起点、终点),然后根据实际情况交替推进两个端点直到得出答案的方法)

给定长度为n的数列正数a0,a1,……,a(n-1)以及整数S。

求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。

输入

n = 10

S = 15

a = {5,1,3,5,10,7,4,9,2,8}

输出

2

算法设计:

1、s=t=sum = 0初始化

2、只要有sum<S,就不断将sum增加a(t),并将t+1

3、2中无法满足sum>=s则终止,否则,使res=min(res.t-s)

使sum=sum-a(s),s增加1,然后回到步骤2

这个算法的t最多变化n次,因此只需要O(n)的复杂度就可以求解这个问题。

反复地推进区间的开头和末尾、来求去满足条件的最小区间的方法称为尺取法。

import java.util.Scanner;public class 尺取法 {public static void main(String[] args) {// TODO Auto-generated method stubScanner cin = new Scanner(System.in);System.out.print("n=");int n = cin.nextInt();System.out.print("S=");int S = cin.nextInt();int[] a = new int[n]; System.out.print("a=");for(int i=0;i<n;i++)a[i]= cin.nextInt();//solveint res = n+1;int s = 0,t=0,sum=0;for(;;){while (t<n&&sum<S)sum+=a[t++];if (sum<S) break;res = min(res,t-s);sum-= a[s++];}if(res>n)res=0;System.out.println(res);}static int min(int a,int b){if(a>=b) return b;else return a;}}


0 0
原创粉丝点击