#The puzzle of eggs and floors
俩崩溃的鸡蛋……
题目:
有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。(假设每次摔落时,如果没有摔碎,则不会给鸡蛋带来损耗)
关键目标就是最小化鸡蛋下落次数(也就是潜在的最大需要下落次数)
基本思路,如果鸡蛋在第n次摔碎了,那么就从第n-1层的地方一层一层往上摔
还好鸡蛋不是摔几次必碎。。。
##1.二分法?
基本确实是要划分,但是如果在99层和第一层就摔坏,最小的鸡蛋下落次数差距略大,所以需要减少下落次数
##2.多分几次
譬如10层一次摔,假如19层会摔坏,那么就是先在10层摔,没坏,在20层摔,坏了。。。。然后从11层开始一层一层摔,这种情况下最坏情况下需要摔18次(100/99层摔坏的时候)
如果要性能优化,当前情况显然不是人力可达的最优,应该是还可以优化
##3.继续优化
这里我们发现,是否可以在次数上平均下,也就是,譬如第一次从10层扔,下次可以在19层扔,下下次是27层扔,这样会发现最差期望会低很多。
那么第一次是x层,第二次x-1层,可以有:
x + (x-1) + (x-2) + ... + 1 >= 100
得x = 14
即我先用第1个鸡蛋在以下序列表示的楼层数不断地向上测试,直到它摔破。 再用第2个鸡蛋从上一个没摔破的序列数的下一层开始,向上测试, 即可保证在最坏情况下也只需要测试14次,就能用2个鸡蛋找出从哪一层开始, 往下扔鸡蛋,鸡蛋就会摔破。
14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100
比如,我第1个鸡蛋是在第77层摔破的,那么我第2个鸡蛋就从第70层开始,向上测试, 第二个鸡蛋最多只需要测试7次(70,71,72,73,74,75,76)
,加上第1个鸡蛋测试的 7次(14,27,39,50,60,69,77)
,最坏情况只需要测试14次即可得出答案。
问题也许还可以拓展,但是不舍得虐鸡蛋了……