100层楼2个鸡蛋

来源:互联网 发布:设计游戏需要什么软件 编辑:程序博客网 时间:2024/04/27 15:32

问题:

有两个一样的特殊鸡蛋,它们有可能在1楼就摔碎了,也有可能从100楼摔下都没碎。现在有100层楼,要你用这两个鸡蛋通过最少的次数确定哪一层是鸡蛋可以安全落下的最高位置。


思路1:

很多人看到这个问题,最先想到的可能是二分法:第一个鸡蛋在50层扔碎了,那第二个鸡蛋在25层扔,没碎再在37层扔,碎了则在13层扔……。这样问题完全变为二分查找,但要求鸡蛋足够多,现在只有两个鸡蛋,所以不能这么做。第一个鸡蛋碎了之后,第二个鸡蛋只能退回去再逐层往上试,否则无法通过两个鸡蛋确认临界安全楼层。

于是二分法变为:“第一个鸡蛋在50层扔下,如果碎了,第二个鸡蛋从1-49逐层试验;如果没碎,第一个鸡蛋在75层扔下,如果碎了,第二个鸡蛋从51-74逐层试验…但是,这个方法,很容易悲剧,例如,当正好49层是可以安全落下的,需要尝试50次。比只有一个鸡蛋的情况(49次),效果还要差。”


思路2:

紧接着的想法是,第一个蛋先在x层扔下,碎了第二个蛋从1试到x-1层,没碎第一个蛋再在2x层扔下,碎了第二个蛋从x+1试到2x-1层…如果x取太大,第二个鸡蛋最多尝试次数(x-1)太多;如果x取太小,第一个鸡蛋最多尝试次数(100/x)太多。为了使两个鸡蛋最多尝试次数之和最小,即最小化x-1+100/x。结果是x=10,最小值为19。最坏情况(99层不碎,100层碎)下,第一个鸡蛋依次在10,20,…,100(可能100层都不碎,所以100也要试)层楼扔下,共10次;第二个鸡蛋91~99逐层扔下,共9次,加起来共19次。问题来了,第一个鸡蛋为什么每次上升相同的层数?没有这个约束的时候,是否会有更优解?


思路3:

的确,该题的最优解为14次,小于思路2的19次。第一次在14层扔第一个鸡蛋:碎了的话,第二个鸡蛋从第1层逐层往上试,最坏情况到13层才碎,此时共用14次;如果没碎,第一个鸡蛋再从14+13=27楼扔下,碎了,第二个鸡蛋从15扔到26,此时第一个鸡蛋扔2次,第二个鸡蛋最多扔12次,总共还是最多14次。以此类推,第一个鸡蛋依次在14,27,39,50,60,69,77,84,90,95,99,100层扔下,无论第一个鸡蛋在哪一层碎,最多尝试次数都为14次。例如临界层为98时,第一个鸡蛋从14试到99(99才碎),共11次,第二个鸡蛋从96试到98,共3次,加起来14次。

这个解法是如何想到的呢?怎么能证明这个就是最优解呢?一个直觉是保证不同情况下最多尝试次数相同,因为通常情况下,取等号得到最优解,如果不是思路2的第一个鸡蛋和第二个鸡蛋扔的次数相同,就是不同情况下最多尝试次数相同。第一个鸡蛋第一次在x楼扔下,如果碎了第二个鸡蛋从1楼扔起,最多尝试x次;如果没碎,第一个鸡蛋只能上升x-1楼(即在2x-1楼)扔下,这样才能保证如果此时鸡蛋碎了最多尝试次数还是x次(第一个鸡蛋扔两次碎了,第二个鸡蛋从x+1扔到2x-2为x-2次,一共x次)。但这个解释还是不足以证明这就是最优解。

换个角度,把问题转化为两个鸡蛋尝试x次,能测出的最高临界层是哪层?为了保证用x次测出临界层,第一个鸡蛋最高只能扔在x层,如果没碎下次上升x-1层,还没碎再上升x-2层,一直没碎的话最后上升1层。即尝试x次,最多测x+(x-1)+(x-2)+...+1=(x+1)x/2。再来考虑原题,为了测到100层,就要使(x+1)x/2>=100,即x>=14。这就证明了这种方法是最优解。


思路4:动态规划

见100层楼2个鸡蛋 - 动态规划

0 0