学习笔记 | 测试杯子在哪个楼层破碎的问题

题目描述:有一种玻璃杯质量确定但未知,需要检测。

  • 有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。
  • 现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?

题目分析:

  • 首先两个杯子的质量是相同的。
  • 如果杯子从第n层掉下来没有碎,那么从第小于n层的任意层丢下去都不会碎。
  • 如果杯子从第n层掉下来碎了,那么从第大于n层的任意层丢下去都会碎。
  • 一个扔出去但没有碎的杯子,可以继续被用于试验,扔下去碎了的杯子不能使用。
  • 最后找到杯子刚好碎了的楼层一定是在第X-1层扔下去没碎,加一层在第X层扔下去碎了,所以得到第X层刚好碎。

方案

  1. 二分法:从 50 楼扔下,没碎的话,再扔 75 楼,再没碎我扔 88 楼,依次下去貌似很快就可以锁定楼层。不过,很不巧,第一次从 50 层楼扔下去就碎了,这个时候就只能从 1 层开始慢慢的的一层一层地扔,如果杯子的质量是刚好在 49 层碎掉的话,那么最差的情况是需要扔 50 次。
  2. 分段查找区间法:核心点:先分区间的扔,再慢慢地一层一层地扔。比如:先从第 10 楼扔,再从第 20 楼扔,依次下去,如果到某一层碎掉,比如 60 层碎掉了,我再从 51 楼开始扔,这样比前面的二分法更快,因为即使又很不巧,杯子的质量比较好,在 99 楼才会刚好碎掉。这样的话,在这种最差的情况下,也只需要扔 19 次就能找到目标楼层。
  3. 基于数学方程的方法:假设最少尝试次数为 x ,那么,第一个杯子必须要从第 x 层扔下,因为:如果碎了,前面还有 x - 1 层楼可以尝试,如果没碎,后面还有 x-1 次机会。这种方法相当于如果没碎的话一直在减少往上递增楼层的层数,刚开始x层,然后x-1层,紧接着x-2、x-3、一直递减,每次都减少一层往上移动的层数。
  • 如果没碎,第一个杯子,第二次就可以从 x +(x - 1)层进行尝试,这里加上 x - 1,是因为当此时,第一个杯子碎了,第二个杯子还有可以从 x + 1 到 ( x + (x - 1) - 1 ) 层进行尝试,有 x - 2 次机会。
  • 如果还没碎,那第一个杯子,第三次从 x + (x - 1) + (x - 2)层尝试。不管杯子碎或者没碎,都有 x - 3 次尝试机会,依次类推。
  • 那么经过 x 次的尝试可以确定最高的楼层为 x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 。那反过来,当最高楼层是100层,最少需要多少次呢?即 x(x+1)/2 >= 100, 得到 x >= 14 ,最少要尝试 14 次。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值