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; //快指针移动 } } } } } }