木棒问题

来源:互联网 发布:印度经济知乎 编辑:程序博客网 时间:2024/04/29 19:02

 

描述
XX有n根长度不同的木棒,有一天它把所有的木棒排成一行,用S1,S2,S3,...,Sn表示.量出每个木棒的长度Sk(1<=k<=n),它发现有两个木棒Si和Sj(1< = i < j < = n),它们之间的所有木棒都比Si要长比Sj短. 
现在给出每个木棒的长度,你需要找到满足上述条件的两个木棒Si和Sj,使得j-i最大. 
(请使用分治法解此题)
输入
输入含有多组数据.每组数据包括两行. 
第一行:一个正整数n(n<=50000),表示木棒的数目 
第二行:n个不同的正整数(不超过100000),表示木棒的长度序列S1,S2,S3,...,Sn
输出
输出最大可能的j-i值,如果这样的i和j不存在,输出-1
例子输入
4

5 4 3 6

4

6 5 4 3
例子输出
1

-1

解答:

这道题采用分治的解法,算法思想并不难。若要求解木棒数组坐标为从z到y,则首先找出该区间内的最大值和最小值所在的位置。设最小值为a[t],最大值为a[s].然后分为三种情况。

1、t=s。此时所有木棒长度相等,显然不符合题意,测结果为-1;

2、t<s。此时将原数组分为三段,z—t-1,t—s,s+1—y。显然第二段的结果即为s-t。然后递归求解剩余的两段,结果中的最大值即为所求;

3、t>s。此时数组也被分三段。z—s,s+1—t-1,t—y。三段中的最大值即为所求。

其实,这道题的难点和重点在于怎么求在给定的数组中,任意区间内的最大值和最小值。显然如果每次通过循环查找,太费时间,也会超时。所以应先用数组记录下来各区间的最值,需要时,就只需要O(1)时间的查找了。

以求最小值为例。最优的方法就是,用数组rmq[i][j]存放从i开始长为2^j的区段中最小值的位置 。首先初始化数组。当i=0时,区间长度为1,所以结果即为本身。计算rmq[i][j]时,将该区间分为两部分,i—i+2^(j-1)-1和i+2^(j-1)—i+2^j-1.

第一段即为rmq[i][j-1],第二段为rmq[i+2^(j-1)][j-1]。两段的最小值即为所求。因此可用动态规划来计算rmq数组。

当要计算区间f—t的最小值时,也将该区间分为两段。设l=t-f。i=[lon l]。将区间分为f—f+2^i-1和t-2^i+1—t。由于这两个区间的长度大于等于l,所以这两区间的最小值即为所求。而这两区间的最小值即为rmq[f][i]和rmq[t-2^i+1][i],前面已经求出。


 

转自:http://www.cnblogs.com/hanlei/archive/2010/07/04/1704767.html