木棒问题
来源:互联网 发布:印度经济知乎 编辑:程序博客网 时间: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
- 木棒问题
- 木棒问题
- 木棒问题
- 木棒问题
- 木棒问题
- POJ 1011 木棒问题
- poj1011 木棒问题
- 1001木棒问题
- 木棒
- 木棒
- 木棒
- 木棒
- 木棒与三角形问题小结
- 最小木棒问题 dfs+ 减枝
- 经典问题:木棒(搜索+强力剪枝)
- poj 1011 回溯+剪枝 木棒问题
- 【OJ】贪心法 (区间问题——木棒)1129/
- 对一个木棒变三角形问题的另一种思考。
- 文字的陷阱
- 解决Centos 或者 Redhat5 vim 中语法不能高亮显示的问题
- log4j.properties文件模板
- 图像处理——第二篇 Java图形图像处理
- 在 Visual Studio 2008 中使用本地 Subversion 库
- 木棒问题
- 不愉快的事情
- 使用键盘的方向键完成类似TAB键的JS代码。
- LINUX下SVN命令大全
- JFreechart的Axis的方法总结
- 数说(一)
- C#动态调用标准DLL和vb(非标准)DLL
- 限制同一台机器上只能运行一个实体(.NET中VB语言)
- 2011请大侠们帮忙指点鸣金