【C++】算法集锦(12):高楼扔鸡蛋

在这里插入图片描述

题目描述

我有一箩筐的鸡蛋,我可以给你两个。
我有一栋一百层的楼,我想让你站在第一百层,以最少的次数帮我测出来鸡蛋最多扔到哪一层不会碎。
你放心扔,如果没碎,不用去捡,我直接补给你一个。
事成之后,这张支票你随便填。

_佰_拾_圆

题目分析(我的想法)

咋样,有什么想法吗?

我说说我的想法,首先,第二个鸡蛋肯定一层一层扔啊(不是两层两层扔)。
那第一个鸡蛋呢?

我是这么想的啊,土是土了点,但我觉得很有效。

1、肯定不能·一层一层扔
2、如果两层两层扔,最多扔100/2+(2-1) = 51次即可(去尾法)。
3、如果三层一扔,最多扔100/3+(3-1) = 354、···
5、如果八层一扔,最多扔100/8+(8-1) = 196、如果九层一扔,最多扔100/9+(9-1) = 197、十层一扔也是19次(7层一扔是20次)
8、十一层一扔,也是199、十二层一扔,1910、十三层,19次

此后再无低于或等于19次的机会了(以十九层(当前最低次数)为限)

那么,这么多种扔法的最坏情况都是一样的情况下,我们该选哪种?
这就涉及概率论了。
我献丑了,不喜欢看的小伙伴可以直接滑下去了。

对第一个鸡蛋而言

扔的层数/砸碎概率一次两次三次四次五次六次七次八次九次十次十一次十二次
八层0.080.080.080.080.080.080.080.080.080.080.080.08
九层0.090.090.090.090.090.090.090.090.090.090.09
十层0.100.100.100.100.100.100.100.100.100.10
十一层0.110.110.110.110.110.110.110.110.11
十二层0.120.120.120.120.120.120.120.12
十三层0.130.130.130.130.130.130.13

对于第二个鸡蛋而言:(记扔的层数为n)
如果在中间层数碎了,概率都是:1/(n-1),如果是最后一次扔都没碎的话,概率是:1/(100%n-1),如果n是10的话,直接不用算了。

接下来就会发现这个期望实在是太难算了。

同时,也有了一个新的问题:
如果我选了扔十层,我第一次扔十层,第二次一定要扔十层吗?我不能扔九层?不能扔十一层?我一定要每次都是十层?
还好我还没去算期望,不然白算了。
还好我事先分析的透彻,不然就浪费半个小时了。


题目再分析

后来,我看到了这么一种解法:
说是一直以同样的层数匹配下去,会对高层鸡蛋不公平。
但是呢,考虑到上面的情况,给出了一种优化,即每次扔的层数递减。
为什么不是迪迦呢?对高层的鸡蛋更不公平了。

所以,要扔到一百层,第一次扔多少呢?我们算一下啊:
1+2+3+4+···+14>100
1+2+3+4+···+13<100
所以第一次扔14层,第二次13层····最后会多5是吧,那就看你心情愿意放哪儿去了。比如我就···5层,3层,2层这样了。
这样就能基本保证投蛋次数普遍在14次波动。

嗯嗯,不错。

在这里插入图片描述

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看,未来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值