POJ 3061

Posted smile_to_warm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3061相关的知识,希望对你有一定的参考价值。

POJ 3061 - Subsequence

描述
给出了N个正整数的序列(10 < N < 100 000),每个正整数小于或等于10000,一个正整数S(S<100000)。
写一个程序求序列中连续元素的子序列的最小长度,其和大于或等于S。

输入
第一行是测试用例的数量。
对于每个测试用例,程序必须从第一行读取数字N和S,用间隔隔开。
序列号在测试用例的第二行中给出,用间隔隔开。输入将在文件结束时完成。

输出
对于每种情况,程序必须在输出文件的单独一行打印结果。如果没有答案,则打印0。

 

package basic_data_structure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * 
 * @author XA-GDD
 *
 ** 思路: 快慢指针
 *
 */
public class A_Subsequence {

	static int [] srcArr=new int[100000];
	static int T,N,S;
	static int [] lenArr=new int[100000];
	static int ans;
	public static void main(String[] args) throws IOException {		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		T =  Integer.parseInt(st.nextToken());
		for(int testCase=1;testCase<=T;testCase++) {
			ans = 0;
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			S = Integer.parseInt(st.nextToken());
			st = new StringTokenizer(br.readLine());
			Arrays.fill(srcArr, 0);
			for(int i=0;i<N;i++) {
				srcArr[i] = Integer.parseInt(st.nextToken());
			}
			Arrays.fill(lenArr, Integer.MAX_VALUE);
			getMinLength();
			Arrays.sort(lenArr);
			ans	= lenArr[0]==Integer.MAX_VALUE?0:lenArr[0];
			System.out.println(ans);
		}
		
	}
	
	static void getMinLength() {
		int len=1;
		int index = 0;
		int sum = srcArr[0];		
		int fastIdx = 1;
		for(int i=0;i<N;i++) {	//慢指针
			for(int j=fastIdx;j<=N;j++) {  //快指针								
				if(sum>=S) { //移左边慢指针,sum-左边的值					
					sum -= srcArr[i];
					lenArr[index]=len; 
					index++;
					len--; //长度-
					break;	//慢指针移动			
				}else { //移右边快指针,sum+右边的值
					if(j<N) {
						sum += srcArr[j];					
						fastIdx++;
						len++; //长度+
						continue;	//快指针移动			
					}
				}			
			}
		}
		
	}

}

  

POJ题目总结

 (1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
(1)枚举. (poj1753,poj2965)
(2)贪心(poj1328,poj2109,poj2586)
(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)

简单模拟
1006, 1008, 1013, 1016, 1017, 1169, 1298, 1326, 1350, 1363, 1676, 1786,
1791, 1835, 1970, 2317, 2325, 2390,

以上是关于POJ 3061的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1064 1759 3484 3061 (二分搜索)

POJ 1064 1759 3484 3061 (二分搜索)

poj3061 Subsequence

POJ 3061

尺取法POJ3061 & POJ3320

poj3061 Subsequence(尺取法)