google校招今年扔鸡蛋的题目:200层的楼,2个鸡蛋,通过在不同的楼层扔出鸡蛋来测试鸡蛋会在哪个楼层摔碎。这个鸡蛋如果第n层碎不了,则第n-1层也碎不了,设计一个最优化的算法,如何最少次数测出鸡蛋会在第几层摔碎。
这个题有两种思路:
1,二分,但单纯的二分绝对不行;
2,一层层的试最省鸡蛋,但无法达到最小次数。
解法就是二者结合即可。一开始采用某种划分,将大楼分为x份,用掉第一个鸡蛋,然后珍惜第二个鸡蛋在失败区间一层层的尝试即可。得到函数:
f(x)=(x+200/x ) - 1
求这个函数极值,对函数求导等于0的点就是极值点,f'(x)=0,即1-200/x^2=0,算出来x=10根号2。大约为14.14..,尝试14和15,发现用14次划分即可,这样有10批14层和4批15层。总次数为27或者28。做一下优化,只要不把15层的划分放到最后即可避免28次。
一般到这里就可以结束了,但受到后面优化的启发,发现如果划分作不相等处理会得到更好的效果。后面每个划分在第一个鸡蛋扔的次数上都比前个划分多一次,从最高划分向下看,可以考虑作首项为1,公差为1的等差数列,得到
X*(X+1)/2=200
解得 X=20,得序列为20+19+...+6+5=200,如此可以得到最少次数为20-1+1=20.
google果然是个爱玩而聪明的孩子,想出这种题目的工程师必定十分eggache!