Skip to content

Latest commit

 

History

History
41 lines (21 loc) · 2.15 KB

the_puzzle_of_eggs_and_floors.md

File metadata and controls

41 lines (21 loc) · 2.15 KB

#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次即可得出答案。

问题也许还可以拓展,但是不舍得虐鸡蛋了……