16年还没毕业的时候就傻傻的去面试一个十份注重算法的公司,当时一道题目,我甚至连题都没看懂,傻傻想二分。
题目如下:
有一栋100层高的大楼,给你两个完全相同的玻璃球,假设从某一层开始丢下玻璃球会摔碎,怎么利用手中的两个玻璃球,用什么最优策略(最少次数)知道这个临界的层是第几层。
思路:球烂了就不能再用,所以二分是不存在的。如果只给我1个球,那么我别无选择,从1楼暴力到100楼,那么100次便是最坏结果,在100楼才烂(没办法,就是这么坚挺)。记f(L,N)为总共几楼对应几个球的最少次数的最坏情况。那么,显然,f(L,1)=L,因为只能暴力从底开始。那么现在的问题转换为求f(100,2)的答案了。暂时没什么思路,但是基础情况显而易见,f(1,2)=1,f(2,2)=2。想到这里,就想起当年被数学归纳法思想统治的时期,不用想,肯定是一个要找到规律的操作。那么当第一个球出手,那么这个球就属于破或者不破的情况(废话),假设从L=100吧,我们从k楼扔下第一个球,如果破,则接下来最多要1+(k-1)=k,即第一个球扔出手,1次,后面暴力从1楼到k-1楼来;那么没破,则等于缩减规模,f(L-k,2)+1。那么现在,最坏情况,则是两者中的较大者,即f(L,2)=max{k,f(L-k,2)+1}。
其实,我觉得走到这一步,思想已经出来了,下面的解法,确实还需要的技巧,但这一步也可以给考官留下不错的印象了。
知乎有位大神给了后面操作如下解释:
结合f(1,2)=1,和f(L,2)=max{k,f(L-k,2)+1}
迭代后f(1,2)=1,有
当n = 1+2+3+...+k
ba(n,2)=k
当k=13时, n=91;
ba(100,2)=max(9,1+ba(91,2))=14
所以100层,最坏情况最优策略的步数是14。
总结:这种题很考数学能力,尤其到最后得到答案的步骤,意味着很浪费时间,那么不如得到个基本条件,加上高层联系条件,相对而言简单有效,能留个印象分,即便没有最终答案。