锁定老帖子 主题:程序员2007年3月刊上的一道算法题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-05
晚上无聊的时候把以前的<程序员>杂志拿出来see see,于是就看到了这个算法题.这文章之前也看过,但当时稍微想了一下就溜过去了.今天看的时候突然产生了一些疑问,于是动手写了几行代码测试了下,结果发现文章中的说法并不完全対. 哦,讲了这么久,忘了说这个题在杂志的第65页的第二题. 注意: 原文并没有给出最优策略 的定义,我这儿根据原文的意思考虑的是这样一种策略: 给出一种策略,使得在最坏的情况下,测试的次数最少 下面是我写的代码:(动态规划算法,时间复杂度O(N^2)) java 代码
运行程序可以看出,对于n=100的情形,存在很多种最优策略,第一次测试选择的楼层可以是从8到14的任意一层.
ps:贴上去的代码有点走样,请下载附件 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-06
这个递归算法也可以很方便的推广到m个棋子,n层楼的情况去.
另外,个人认为<程序员>上的这篇文章写的不太好.文中用所谓的"数学事实"来解释问题的答案,但我认为这个问题作为一个算法题来讲,应该从递归,动态规划这些常用的算法角度来入手,更有意义一些. 当然,这个题确实可以从数学推理上来给出简洁的结果(可惜文中给的推理既不完整也不严谨).但其推理并不是那么明显的.还是用代码来解决更爽快一些. |
|
返回顶楼 | |
发表时间:2007-05-08
引用 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 4 -> 5 -> 4 -> 2 -> 2 -> 1
14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 4 -> 5 -> 4 -> 3 -> 1 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 4 -> 5 -> 4 -> 3 -> 2 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 3 -> 4 -> 3 -> 2 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 4 -> 3 -> 3 -> 2 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 4 -> 4 -> 2 -> 2 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 4 -> 4 -> 3 -> 1 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 4 -> 4 -> 3 -> 2 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 5 -> 2 -> 3 -> 2 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 5 -> 3 -> 2 -> 2 -> 1 14 -> 13 -> 12 -> 11 -> 10 -> 7 -> 7 -> 7 -> 5 -> 5 -> 3 -> 3 -> 1 -> 1 ... 这个结果有点看不懂阿 |
|
返回顶楼 | |
发表时间:2007-05-08
那个,就是说:
第一次从14楼扔下去测试,如果没破,归结到86(100-14)楼的情形 ->下一次从上面86层的第13层开始测试(也就是100层中的第27层(13+14)),如果没破,归结到73层的情形->...->... 如果第一次(14层)破了,这是只能从用剩下的一颗棋子从第一层一直往上测试,这时总共最多会测试14次 其余类推. 可能讲的不是很清楚,直接看我代码上的算法说明应该更容易理解. |
|
返回顶楼 | |
发表时间:2007-05-08
看半天没明白为啥要一层一层走
为啥不直接一半一半走 2个条件啊,第一把放50层,碎了向下走一半,没碎向上走一半 用不了多少次就会固定了啊 还是我没理解这题呢? |
|
返回顶楼 | |
发表时间:2007-05-08
呵呵,按楼上说的",第一把放50层,碎了向下走一半"
那么如果再碎了呢?怎么确定临界层? 注意:这里只有两颗棋子,用完就没有了.而不是无限颗. |
|
返回顶楼 | |
发表时间:2007-05-08
没有仔细看你的算法。我喜欢看数学公式。
我列出的公式是 |100%n|+n-1求最小值时n |
|
返回顶楼 | |
发表时间:2007-05-08
Eastsun 写道 呵呵,按楼上说的",第一把放50层,碎了向下走一半"
那么如果再碎了呢?怎么确定临界层? 注意:这里只有两颗棋子,用完就没有了.而不是无限颗. 啊,是这样 但是我没明白那个是根据什么算地,我感觉每一层都有碎的可能,那么答案应该是放在第几层? 你那个算的是14层?还是什么 没明白啊 如果是14层,14层碎了咋办,往下放还是任意一层都有碎的可能啊 |
|
返回顶楼 | |
发表时间:2007-05-08
bonny 写道 没有仔细看你的算法。我喜欢看数学公式。
我列出的公式是 |100%n|+n-1求最小值时n 嘿嘿,我看到网上有也有人用你这个公式来解决这个问题. 不过,就个人看来,这个公式是错的. |
|
返回顶楼 | |
发表时间:2007-05-08
我觉得这个是一个典型的概率计算。
|
|
返回顶楼 | |