无意间看到这个题目,想了很久才想通(IQ偏低),而且网上很多文章的描述得不是很清楚,在此分享一下个人看法,随便记录一下,如有不对的对方,欢迎指正,谢谢!
问题:有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层?
1、在这里我们先忽略最优策略的解决方案
(1)最简单的办法就是从底层(1L)逐层往上(100L)尝试,最多要99次才能确定破碎楼层(即100L破碎)。
(2)针对(1)的方案改进一下,第一个球用折半尝试,第二个球用逐层尝试,最多要50次才能确定破碎楼层(即50L破碎)。
(3)考虑对100L层楼分成N段(N=100的平方根,即10段、每段10L),用第一个球来确认球在哪个段破碎,然后用第二个球在该楼层段逐层尝试,最多要19次才能确定破碎楼层(N+9)
2、最优策略的解决方案
为了使最坏情况的投掷数最小,我们希望无论临界段在哪里,总的投掷数都不变,也就是说投掷数均匀分布。
这里可以看成是针对(3)的优化方案。
第一步:确定临界段(初步确认破碎楼层范围)
第二步:确定临界层(逐层尝试破碎楼层)
描述:为了使投掷数均匀分布(假设最多投掷N次),所以
临界段标号 | 1 | 2 | 3 | ... | i |
临界层层数L | N | N-1 | N-2 | ... | N-i+1 |
临界段范围D | 1~N | D1 + 1 ~ D1 + L2 | D2 + 1 ~ D2 + L3 | ... | Di-1 + 1 ~ Di-1 + Li |
最多投掷次数 | N | N | N | N | N |
由于N取值范围(1~N),所以
当N等于1时,确认临界段最多需要C1次(即1次);
当N等于2时,确认临界段最多需要C2次(即2次);
......
当N等于N-1时,确认临界段最多需要Cn-1次(即N-1次);
当N等于N时,确认临界段最多需要Cn次(即N次);
所以
C1+C2+C3+...+Cn >= 100
=> 1+2+3+...+N >= 100
=> N(N+1)/2 >= 100 (因为N是正整数)
=> N >= 14
=> N=14
临界段标号 | 1 | 2 | 3 | ... | i |
临界层层数L | 14 | 13 | 12 | ... | N-i+1 |
临界段范围D | 1~14 | 15~14+13 | 28~27+12 | ... | Di-1 + 1 ~ Di-1 + 1 + Li-1 |
最多投掷次数 | 14 | 14 | 14 | 14 | 14 |
比如39层,玻璃碎了:
用第一个球依次从14层、27层、39层抛下(39层碎了,共3次)
用第二个球依次从28层、29层、30层、31层、32层、33层、34层、35层、36层、37层、38层抛下(因为27层没碎,共11次)