挑战程序设计竞赛:尺取法

1. 题目介绍

1.1 题目

Subsequence (POJ No.3061)

给定长度为n的数列整数a0,a1,…,an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。

限制条件:

  • 10 < n < 105
  • 10 < ai <= 104
  • S < 108

1.2 样例1

输入

n = 10

S = 15

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

输出

2 (5+10)

1.3 样例2

输入

n = 5

S = 11

a = { 1, 2, 3, 4, 5 }

输出

3 (3+4+5)

2. 思路讲解

视频讲解总地址:传送门

题目介绍视频:传送门

2.1 二分法

二分法视频讲解:传送门

(摘抄自教材)由于所有的元素都大于零,如果子序列[s, t)满足as + … + at-1 >= S,那么对于任何的t < t’一定有as + … + at’-1 >= S。此外对于区间[s, t)上的总和来说如果令:
s u m ( i ) = a 0 + a 1 + . . . + a i − 1 sum(i) = a_0 + a_1 + ... + a_{i-1} sum(i)=a0+a1+...+ai1
那么
a s + a s + 1 + . . . + a t − 1 = s u m ( t ) − s u m ( s ) a_s + a_{s+1} + ... + a_{t-1} = sum(t) - sum(s) as+as+1+...+at1=sum(t)sum(s)

2.2 尺取法

尺取法视频讲解:传送门

(摘抄自教材)设以as开始总和最初大于S时的连续子序列为as + … + at-1,这时:
a s + 1 + . . . + a t − 2 < a s + . . . a t − 2 < S a_{s+1} + ... + a_{t-2} < a_s + ... a_{t-2} < S as+1+...+at2<as+...at2<S
所以从as+1开始总和最初超过S的连续子序列如果是as+1 + … + at’-1的话,则必然有t<=t’。


代码视频讲解:传送门

3. 练习题

  1. Jessica’s Reading Problem (POJ No.3320)
  2. Bound Found (POJ No.2566)
  3. Sum of Consecutive Prime Numbers (POJ No.2739)
  4. Graveyard Design (POJ No.2100)

4. 附录:程序代码

4.1 Java

  1. 程序代码:传送门

4.2 C++

从教材上面直接摘抄的代码,所以没有输入数据处理,只有解法,供有需要的童鞋参考。

4.2.1 二分法

// 输入
int n, S;
int a[ MAX_N ];

int sum[ MAX_n + 1 ];

// O( nlogn )
void solve() {
	// 计算sum
	for ( int i = 0; i < n; i++ ) {
		sum[ i + 1 ] = sum[ i ] + a[ i ];
	}

	if ( sum[ n ] < S ) {
		// 解不存在
		printf( "0\n" );
		return;
	}

	int res = n;
	for ( int s = 0; sum[ s ] + S <= sum[ n ]; s++ ) {
		// 二分法查找t
		int t = lower_bound( sum + s, sum + n, sum[ s ] + S ) - sum;
		res = min( res, t -s );
	}

	printf( "%d\n", res );
}

4.2.2 尺取法

// O(n)
void solve() {
	int 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;
	
	printf( "%d\n", res );
}

5. 附录:拓展阅读

  1. 计算几何课堂:几何寻路之旅
  2. 超详细!红黑树详解文章汇总(含代码)
  3. 几何求交(一):直线和直线的交点
  4. 几何求交(二):直线和圆的交点

6. 参考资料

  1. 《挑战程序设计竞赛(第2版)》,(日)秋叶拓哉 等著,人民邮电出版社;

7. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值