javascript - 好多公司经常面的一道智力题,加分的
阿神
阿神 2017-04-11 09:45:35
[JavaScript讨论组]

一幢 200 层的大楼,给你两个鸡蛋。如果在第 n 层扔下鸡蛋,鸡蛋不碎,那么从第 n-1 层扔鸡蛋,都不碎。这两只鸡蛋一模一样,不碎的话可以扔无数次。最高从哪层楼扔下时鸡蛋不会碎?

阿神
阿神

闭关修行中......

全部回复(10)
PHP中文网

这道题应该是考察至少需要抛几次来判断鸡蛋最高从多少层掉下去不会碎吧。

要减少最大尝试次数,最常规的思路就是使每种投掷情况看上去更“平均”。
这里我们假设最少需要抛掷的次数为n,那么我第一次抛掷的楼层会选择第n层,因为一旦滴一个鸡蛋在第n层摔落时碎了,则第二个鸡蛋我们需要从第1层到第n-1层逐一尝试来寻找,这样最大的尝试次数是在第n-1层投掷时才知道鸡蛋在这一层会不会碎,也就是需要n次实验。

如果在第n层没碎,则我们需要再向上选择楼层抛第一个鸡蛋,由于之前已经抛过一次,那么这次我们只能选择n+n-1层来抛,这样才能保证如果在n+n-1层出现蛋碎的情况下,从n+1层实验到n+n-1层所尝试的次数加上前2次的总和为n。

此处省略。

如果之前的尝试都没有成功,而我们离n次的限制还剩余1次了,这一次就必须只能存在一个可选楼层上,这也应该是最高一层。

如此看来,可以得到一个公式,

$$ n + (n - 1) + (n - 2) + ... + 1 >= 200 $$

进行公式的简化

$$ n ^ 2 + n - 400 >= 0 $$

求这个公式的最小整数解为 20 。
所以,最少需要抛掷 20 次。

天蓬老师

2的n次方 我猜的

ringa_lee

可以拿一个鸡蛋从第一层开始一层一层向高层试,O(n)的解法。也可以拿两个鸡蛋同时从1层3层试,3层扔下的鸡蛋没破就把1层的鸡蛋拿到5层,破了就把1层的鸡蛋拿到2层,循环下去,O(n/2)的解法。

PHPz

有两个鸡蛋,鸡蛋不碎可以无限扔,可以从偶数层开始扔

PHP中文网

一层层丢过去,哪层碎了就是哪层咯

大家讲道理

相隔14层测试,
失败后第二个鸡蛋从之前的成功点向上测试
最多14+13次测试出来

高洛峰

明确变量,稍微地整理一下问题和最高票答案。
在一幢200层的大楼上给你两个鸡蛋。
如果鸡蛋在a层时扔下不碎,那么他从1到a-1都不会碎。
求最少需要扔多少次才能确认a的最大值?

解:
假设需要扔n次可以确认a的最大值,两个鸡蛋分别为鸡蛋A和鸡蛋B。
下面开始推导:
1)、如果第一次从n层扔下A鸡蛋并且A碎了,那么剩下的B鸡蛋只能从1开始往n-1试,试n-1次
2)、如果A鸡蛋没碎,那么剩余可以尝试的次数是n-1次,所以第二次扔的楼层是n+n-1层,如果碎了,就从n+1层到n+n-1层之间进行尝试
3)、如果A鸡蛋依然没碎,第三次从n+n-1+n-2层开始扔...

直到n次扔完,但是n层扔完的楼层总数不能超过200,由此可得:
n+(n-1)+(n-2)+···+3+2+1 >= 200

(1+n) n / 2 >= 200

n取最小整数解为20.

所以从第20层开始扔,能最快找到n的最大值。

黄舟

难道不是第200层吗...=_=

黄舟

感觉这个问题没描述清楚

PHPz

吃到肚子里,然后跳楼。。。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号