POJ3061 尺取法

原创 2016年08月28日 18:58:11

n个数字,求最短的连续的数字长度,满足和>=s

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) {
		new POJ3061().solve();
	}
}

class POJ3061 {

	InputReader in = new InputReader(System.in);
	PrintWriter out = new PrintWriter(System.out);
	final int N = 100008;
	int[] a = new int[N];

	void solve() {
		int t = in.nextInt();
		while (t-- > 0) {
			int n = in.nextInt();
			int s = in.nextInt();
			for (int i = 0; i < n; i++)
				a[i] = in.nextInt();

			int start = 0, end = 0, sum = 0, res = n + 1;
			for (;;) {
				while (end < n && sum < s) {
					sum += a[end++];
				}
				if (sum < s)
					break;
				res = Math.min(res, end - start);
				sum -= a[start++];
			}
			out.println(res == n + 1 ? 0 : res);
		}
		out.flush();
	}
}

class InputReader {
	public BufferedReader reader;
	public StringTokenizer tokenizer;

	public InputReader(InputStream stream) {
		reader = new BufferedReader(new InputStreamReader(stream), 32768);
		tokenizer = new StringTokenizer("");
	}

	private void eat(String s) {
		tokenizer = new StringTokenizer(s);
	}

	public String nextLine() {
		try {
			return reader.readLine();
		} catch (Exception e) {
			return null;
		}
	}

	public boolean hasNext() {
		while (!tokenizer.hasMoreTokens()) {
			String s = nextLine();
			if (s == null)
				return false;
			eat(s);
		}
		return true;
	}

	public String next() {
		hasNext();
		return tokenizer.nextToken();
	}

	public int nextInt() {
		return Integer.parseInt(next());
	}

	public long nextLong() {
		return Long.parseLong(next());
	}

	public double nextDouble() {
		return Double.parseDouble(next());
	}

	public BigInteger nextBigInteger() {
		return new BigInteger(next());
	}

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ3061(尺取法)

问题描述: 分析:这题当然可以用暴力的方法求,但是很明显这样时间复杂度会非常大,就和之前的连续子序列和最大,用暴力枚举起点和终点,这样是O(n^2)。另外一种思路: 由于所有的元素都大于零,如果子...
  • karry_zzj
  • karry_zzj
  • 2017年04月19日 23:54
  • 180

尺取法 poj3061

尺取法:就是两个指针表示区间[l,r]的开始与结束然后根据题目来将端点移动,是一种十分有效的做法。适合连续区间的问题 1 poj3061   给定长度为n的数列整数a0,a1,a2,a3 ...
  • sentimental_dog
  • sentimental_dog
  • 2016年05月29日 20:20
  • 229

Poj3061(尺取法)

Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17572 Accepted:...
  • FEATHER2016
  • FEATHER2016
  • 2018年01月23日 15:56
  • 20

POJ3061尺取法)

: 5000MS   Memory Limit: 65536K Total Submissions: 1348   Accepted: 448   Special Judge Descrip...
  • reallsp
  • reallsp
  • 2017年04月24日 08:49
  • 113

poj3061 尺取法

如题:http://poj.org/problem?id=3061 Subsequence Time Limit: 1000MS   Memory Limit: 65536K ...
  • Twenty_seven
  • Twenty_seven
  • 2015年03月06日 14:59
  • 202

poj3061(尺取法)

#include using namespace std; const int maxn=1e5+10; #define inf 0xfffffff int a[maxn]; long long su...
  • zizahn
  • zizahn
  • 2016年07月24日 13:27
  • 96

Subsequence poj3061(尺取法)

Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13114   A...
  • lwgkzl
  • lwgkzl
  • 2016年12月20日 20:40
  • 107

[尺取法] poj3061 Subsequence

http://poj.org/problem?id=3061//设置以下的算法: //1、给定起点s=e=1; //2、e一直往后走,直到sum(s,t)>S 更新res //3、减去第一个数,...
  • u012848631
  • u012848631
  • 2015年08月03日 10:41
  • 219

POJ3061 -- Subsequence(尺取法)

问题描述: 第一行给出测试数据个数 第二行给出n和k 第三行给出n个数 求满足和大于等于k的最短连续子序列长度 思路: 我们可以这样来考虑:把状态定义为:从第一个数开始,每次求出从第i个数开始的和...
  • qq_38230420
  • qq_38230420
  • 2017年08月03日 00:32
  • 86

POJ3061尺取法和二分法

Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10613   A...
  • zcj5027
  • zcj5027
  • 2016年02月10日 13:06
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ3061 尺取法
举报原因:
原因补充:

(最多只允许输入30个字)