算法脑筋急转弯
四瓶药,每瓶含量若干,其中一瓶过期了,过期的药片比正常的药片的重量+1,正常药片的重量是已知的,现在有一个电子秤,请问如何在只秤一次的情况下找出过期的那瓶药?
可以利用数字编码的方式,只通过一次称重找出过期的那瓶药。方法如下:
步骤:
编号:将四瓶药分别编号为 1、2、3、4。
取样:从第 ( i ) 瓶药中取出 ( i ) 片药:
- 从 第 1 瓶 取 1 片,
- 从 第 2 瓶 取 2 片,
- 从 第 3 瓶 取 3 片,
- 从 第 4 瓶 取 4 片。
称重:
- 假设正常药片的重量为 ( w ),
- 过期药片的重量为 ( w + 1 )。
- 如果所有药片都是正常的,总重量应为:
[
1w + 2w + 3w + 4w = 10w
] - 但由于某一瓶药的药片过期,它的药片重量会比正常重量多出 过期药片数 × 1。
分析结果:
- 设称得的总重量为 ( S ),
- 计算超出的重量:
[
S - 10w
] - 这个值等于 过期药瓶的编号,因为我们从第 ( i ) 瓶中取了 ( i ) 片药,而过期药片的重量比正常药片多 1,所以增加的总重量正好是 ( i )。
示例:
假设 第 3 瓶药过期,那么:
- 取样药片总数:( 1 + 2 + 3 + 4 = 10 ) 片,
- 理论总重量:( 10w ),
- 实际称重:( 10w + 3 ),
- 多出的重量为 3,因此第 3 瓶 过期。
结论:
通过一次称重,即可根据超出的重量直接确定哪一瓶药过期。
现有两支香,他们长短粗细各不相同,但是燃烬的时间都是一小时,请问我要如何得到15分钟?
可以利用香燃烧速度不均匀但总时间固定的特性,通过 两端点燃 和 顺序点燃 来测量 15分钟。
步骤:
第一支香:两端同时点燃,它会在 30分钟 内燃尽(因为燃烧速度加倍)。
第二支香:只点燃一端,它仍然需要 60分钟 燃尽。
当第一支香燃尽时(即 30分钟过去了),立即点燃第二支香的另一端。
- 由于此时第二支香已经燃烧了 30分钟,还剩 30分钟 可燃时间。
- 现在两端同时点燃,燃烧速度加倍,因此 剩余部分会在 15 分钟内燃尽。
结论:
第一支香 + 第二支香的双端燃烧,即可精准测得 15分钟!
有两个容器分别是5L与6L,如何精准得到3L的水?
我们可以利用 倒水、装满、倒空 的操作,通过 6L 和 5L 容器的相互转换,精准得到 3L 的水。
方法 1:使用 6L 容器倒入 5L 容器
- 6L 装满(6L 容器有 6L 水)。
- 把水倒入 5L 容器,5L 容器装满,6L 还剩 1L(6L → 1L,5L → 5L)。
- 倒掉 5L 容器的水(6L → 1L,5L → 0L)。
- 把 6L 容器的 1L 倒入 5L 容器(6L → 0L,5L → 1L)。
- 再次装满 6L 容器(6L → 6L,5L → 1L)。
- 将 6L 容器的水倒入 5L 容器,直到 5L 容器装满(6L 倒 4L 进去)。
- 此时 6L 还剩 3L(✅ 成功得到 3L!)
方法 2:使用 5L 容器倒入 6L 容器
- 5L 容器装满(5L → 5L,6L → 0L)。
- 把 5L 容器的水倒入 6L 容器(5L → 0L,6L → 5L)。
- 再次装满 5L 容器(5L → 5L,6L → 5L)。
- 往 6L 容器倒水,只倒 1L(因为 6L 只能装 1L)。
- 此时 6L 容器变成 6L(满了),5L 容器剩 4L。
- 倒掉 6L 容器的水(5L → 4L,6L → 0L)。
- 把 5L 容器中的 4L 倒入 6L 容器(5L → 0L,6L → 4L)。
- 再次装满 5L 容器(5L → 5L,6L → 4L)。
- 把 5L 容器的水倒入 6L 容器,只倒 2L,此时 6L 容器装满,5L 还剩 3L(✅ 成功得到 3L!)。
总结
- 方法 1(6L 容器倒 5L 容器):更直接,6L 只剩 3L 时停止。
- 方法 2(5L 倒 6L):依靠不断装满倒水的方式,最终剩 3L。
这两种方法都可以 精准获得 3L 水!💡
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LiuCheng's Blog!
评论