【引用】google扔鸡蛋

解析谷歌校招中一道经典的扔鸡蛋问题,探讨如何利用有限的尝试次数找到鸡蛋摔碎的确切楼层,并给出了一种结合二分法与逐层尝试的最优解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnlxj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值