[百度面试题]100层楼丢玻璃球问题
2013-03-19 20:48
302 查看
有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层??
解题思路:
假如只有一个球,那很显然,只有一个办法:从第一层开始投,如果没碎再试第二层、第三层.....
现在有两个球,我们应该利用第一个球缩小临界楼层所在的楼层范围,可能会想到第一个球先从50层开始投,如果碎了,再用最后一个球从第一层开始投,最多到49楼肯定可以找到临界楼层,如果没碎那就说明临界楼层在50-100中,此时继续尝试75楼....
可惜,上面的方法并非是最好的。因为最坏情况的投掷次数分布不均匀。比如,如果50楼碎了,此时最坏情况下需要尝试50次,如果50楼没碎,而75层不管是否碎了,最坏情况也只需要尝试25次,也就是说,50楼投掷结果不同,所需最坏情况下的次数也不同,这就是分布不均匀的意思,那是否有办法让其分布均匀,也就是说假如在f层投,不管碎还是不碎,继续时最坏情况所需次数也是一样的。这样才能使最坏情况下所需投掷次数达到最小。
假设一开始从第k层投,如果坏了,那么第二个球可以在剩下的k-1层一定能用k-1次确定哪层坏,再加上第k层的那次,所以总共k次。如果第k层没有坏,那么第一个球在第k层的基础上再加k-1层(注意不是k层,原因见后面),所以第二次从2k-1层投下,在k,k+1,k+2,……,2k-2,2k-1中则有k-2层,所以用k-2次才能找出,再加上原来的那两次,还是共用了k次(为了保持总共还是k次,所以上面只能加k-1层)
依次类推.....
在第2k-1层基础上再加k-2层,在第3k-3层基础上再加k-3层,……,依次类推,一定能加到在第某层的基础上再加2层,最后再原来的基础上面还能再加1层,到目前为止,设为第n-1层,如果第n-1层坏了,那么就是第n-1层,如果没有坏,根据已知题说某一层能摔碎球,那么在第n-1层上面有且仅还有一层就是刚摔坏的层(此时不需要实际投,而是直接推理得出),这时用的次数还是k次(最不理想的结果),所以k次能测最多n层,由上面的解说,可知n-1=k+(k+1)+(k+2)+(k+3)+……+2+1=k(k+1)/2,得n=k(k+1)/2+1,由上面可知n=100(层),k次最多能推测k(k+1)/2+1(层),所以k(k+1)/2+1≥100,得k(k+1)≥198,且k的最小整数为14,所以最多14次就能找出题目中的那层。
补充:由上得知,第一次在14层投,第二次在第27层投,则依次为14 27 39 50 60 69 77 84 90 95 99。还能得出14次最多能测得到106楼,只不过题目中给了100楼,如果是107楼,那么就需要15次了。
解题思路:
假如只有一个球,那很显然,只有一个办法:从第一层开始投,如果没碎再试第二层、第三层.....
现在有两个球,我们应该利用第一个球缩小临界楼层所在的楼层范围,可能会想到第一个球先从50层开始投,如果碎了,再用最后一个球从第一层开始投,最多到49楼肯定可以找到临界楼层,如果没碎那就说明临界楼层在50-100中,此时继续尝试75楼....
可惜,上面的方法并非是最好的。因为最坏情况的投掷次数分布不均匀。比如,如果50楼碎了,此时最坏情况下需要尝试50次,如果50楼没碎,而75层不管是否碎了,最坏情况也只需要尝试25次,也就是说,50楼投掷结果不同,所需最坏情况下的次数也不同,这就是分布不均匀的意思,那是否有办法让其分布均匀,也就是说假如在f层投,不管碎还是不碎,继续时最坏情况所需次数也是一样的。这样才能使最坏情况下所需投掷次数达到最小。
假设一开始从第k层投,如果坏了,那么第二个球可以在剩下的k-1层一定能用k-1次确定哪层坏,再加上第k层的那次,所以总共k次。如果第k层没有坏,那么第一个球在第k层的基础上再加k-1层(注意不是k层,原因见后面),所以第二次从2k-1层投下,在k,k+1,k+2,……,2k-2,2k-1中则有k-2层,所以用k-2次才能找出,再加上原来的那两次,还是共用了k次(为了保持总共还是k次,所以上面只能加k-1层)
依次类推.....
在第2k-1层基础上再加k-2层,在第3k-3层基础上再加k-3层,……,依次类推,一定能加到在第某层的基础上再加2层,最后再原来的基础上面还能再加1层,到目前为止,设为第n-1层,如果第n-1层坏了,那么就是第n-1层,如果没有坏,根据已知题说某一层能摔碎球,那么在第n-1层上面有且仅还有一层就是刚摔坏的层(此时不需要实际投,而是直接推理得出),这时用的次数还是k次(最不理想的结果),所以k次能测最多n层,由上面的解说,可知n-1=k+(k+1)+(k+2)+(k+3)+……+2+1=k(k+1)/2,得n=k(k+1)/2+1,由上面可知n=100(层),k次最多能推测k(k+1)/2+1(层),所以k(k+1)/2+1≥100,得k(k+1)≥198,且k的最小整数为14,所以最多14次就能找出题目中的那层。
补充:由上得知,第一次在14层投,第二次在第27层投,则依次为14 27 39 50 60 69 77 84 90 95 99。还能得出14次最多能测得到106楼,只不过题目中给了100楼,如果是107楼,那么就需要15次了。
相关文章推荐
- [百度面试题]100层楼丢玻璃球问题
- 如何编程解决百度面试题100盏灯问题
- 股票买进卖出问题—百度实习招聘面试题
- 百度面试题:用链表交叉判断迭代打开url问题
- 【百度面试题】循环有序数组的查找问题
- 百度面试题之桶中取球(咖啡罐问题的变形)
- 百度面试题——最大连续数字串问题
- 一道简单的百度面试题遇到的问题
- 百度面试题 0-1背包问题-动态规划法
- 百度面试题——存储和维护URL问题
- 面试题实现--(百度的不存在数查找问题)
- [百度面试题]100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层
- 百度面试题 :玻璃球 临界值
- 百度面试题——捣乱分子对问题
- 面试题实现--(百度的不存在数查找问题)
- 100层楼和两个玻璃球的问题
- 百度面试题-类似Excel列名的位置查找问题
- 百度面试题--5只蚂蚁走木棍问题的非递归解法(Java调试通过)
- 谷歌面试题-100层楼两个棋子的问题
- 部分有序中查找给定值-【百度面试题】循环有序数组的查找问题