有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋
子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层面。
中午猛的又想起google 的那道面试,今天系统的记录一下自己的思路。
首先,两次要找到临界点,必须区间来找,第一个球找到临界的区间,用第二个球在区间内试。要得到最优的解必须先从问题的根源考虑,玻璃球摔碎的条件是自身的承受力的能力达到自身的极限,不考虑实验过程中球的性能损失等因素(摔裂什么的情况),更具物理知识,受到力的大小Ft = mv2 - mv1,这里我们的初始速度为0,F大小和速度成正比。从上到下是一个匀加速的过程,所以应该把速度分成x 个区间,来找最优值。
速度分成x个区间,必然每个区间的距离是不一样的,但是有联系。
因为初始速度为0,既然按速度来分区间,于是每个区间的时间是固定的,设为t,先不管分几个区间。
第一个区间: 2gS1 = (gt)2
第二个区间: 2gS2 = (2gt)2-(gt)2
第三个区间 : 2gS3= (3gt)2-(2gt)2 . . .
事实上,可以发现,每个区间的差值,Sn-S(n-1)是固定值,C = 2(gt)2.
这样就好办了,假设在100层中,首先在m层试投,然后每隔d 层递减来投(这里的d和上面理论上的差值不是同一个值,上面只是为了确定C是一个常数)。 问题可以简化为,在100 层之内试出临界层,也就是在m投后,在m-d 层投,限制条件为必须在100 层之内出结果 ,表达式为:m+(m-d)+(m-2d)+...+1 >= 100
等差数列求和的公式 m + {m(m-1)d}/2 >= 100 即:m2+(2-d)m >= 100 限于现有楼层的条件,正整数,求m 的最小值。
显然 f(m) = m2+(2-d)m 是一个 递增函数,求他的最小值,只有当d 最小的时候,d 取1。
得出 m = 14.
(其实网上面有14 的答案,我这边只是给出这种算法的理由,为什么要分区间,确定以及化解为等差数列,以及等差的确定。使之在理论上成为最优解。)