两个玻璃球求临界楼层问题

来源:互联网 发布:centos ip 命令不存在 编辑:程序博客网 时间:2024/06/11 23:27

问题描述:
有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层。


问题答案:

考虑best-worse case最坏情况下最优。也就是说假如你的算法是从第一楼逐楼往上试,那么相应最坏的情况是在100楼破,相应的是一百次。
这种情况下最优策略也就是从14楼开始递减间隔的办法,worst case 需要14次。

 14 , 27(14 + 13) , 39(27 + 12) , 50(39 + 11) , 60(50 + 10) , 69(60+ 9) , 77(69 + 8) ,84(77 + 7) , 90(84 + 6) , 95(90 + 5) , 99(95 + 4) 


问题分析:

作者:bh lin
链接:https://www.zhihu.com/question/31855632/answer/54367825
来源:知乎

记n层s球的问题为Q(n,s),对应的最坏情况最优解为ba(n,s);
一些简单的结果:
(0) ba(m,2)>=ba(n,2) 如果m>n,trivial.
(1) ba(n,1)=n
当你只剩下一个球,为了能够检验出临界点,你只能逐层检验,最坏情况下所需的检验次数为n;
(2)ba(1,2)=1
(3)iterative: 假设你从k层扔球,有两种情形:
球破。那么临界层必然在1层到k-1层之间,剩下一球,由(1)得出,最坏情况最优所需的步数为: 1 + ba(k-1,1)=k;
球不破。问题变成n-k层两球的问题Q(n-k,2), 所以最坏情况最优所需步数是:1+ba(n-k,2);
综合1,2,最坏情况所需步数: ba(n,2)=\max\{k,1+ba(n-k,2)\}
当k=1+ba(n-k,2)的时候,
ba(n,2)=ba(n-k,2)+1
结合(2),(3),由(2)迭代得知:
当n = 1+2+3+...+k
ba(n,2)=k
当k=13时, n=91;
ba(100,2)=max(9,1+ba(91,2))=14
所以100层,最坏情况最优策略的步数是14.


公式:

楼层 N,开始楼层为 f

f*(f+1)/2 >= N

求f的最小值


1 0