其中一个经典的编程面试问题......
给你两个大理石,并告诉他们从某个高度下降时会破裂(如果从那个高度以下掉落,可能不会受到伤害).然后你被带到一座100层高的建筑物(大概高于一定的高度),并要求找到最高的楼层,你可以尽可能高效地将大理石从大地上掉下来.
额外信息
mre*_*gen 51
这里有趣的是你如何以尽可能少的跌落来做到这一点.如果破土动工是第49层,那么去50楼并放弃第一层将是灾难性的,导致我们不得不做50滴.我们应该将第一块大理石放在地板n处,其中n是所需的最大滴量.如果大理石在地板n处破裂,我们可能必须在此之后进行n-1滴.如果大理石没有破裂,我们会上升到2n-1楼,如果它在这里破裂,我们必须在最坏的情况下将第二块大理石放下n-2次.我们继续这样直到100楼,试图在3n-2,4n-3 ......
和n +(n-1)+(n-2)+ ...... 1 <= 100 n = 14时打破它
是否需要最大滴数
her*_*tao 13
" 破解编码面试(第5版) "一书中的问题6.5涵盖了这个问题,解决方案总结如下:
无论我们如何删除Marble1,Marble2都必须进行线性搜索.例如,如果Marble1在10楼和15楼之间断裂,我们必须检查Marble2之间的每个楼层
第一次尝试:假设我们从10楼掉落大理石,然后是20号,......
目标: 创建一个用于删除Marble1的系统,以便所需的最多滴数是一致的,无论Marble1是在第一滴还是最后一滴上断开.
我们去14楼,然后是27,然后是39,......这最多需要14步.
对于代码实现,您可以在这里查看.
对于N
大理石,M
地板的扩展,请查看第12章:鸡蛋和地板的难题.
归档时间: |
|
查看次数: |
13384 次 |
最近记录: |