# 3. 药瓶毒白鼠

描述:有1000瓶药水,其中仅有一瓶是有毒的。已知服用毒药后,小白鼠会在24小时内死亡。你有10只小白鼠,如何在24小时内确定哪一瓶是毒药?

# 题目分析

在 24 小时内,我们最多只能进行 一次实验,即每只小白鼠在实验结束后要么存活,要么死亡(两种状态)。因此,我们需要用 10 只小白鼠的死亡情况来编码并唯一确定毒药瓶号

10 只小白鼠,每只可以有 2 种状态(生存/死亡),那么 10 只小白鼠能表示的最大编号数量为:
[ 2^{10} = 1024 ] 这足以唯一确定 1000 瓶药水中的毒药。

# 解决方案

核心思路:将药瓶编号转换为二进制,并利用小白鼠的生死情况来还原毒药编号。

# 步骤 1:药瓶编号二进制表示

将 1000 瓶药水从 1 号到 1000 号进行编号,并将编号转换为 10 位二进制数(因为 (2^{10} = 1024) 足够表示 1000 个编号)。例如:

  • 1 号药瓶 → 0000000001
  • 2 号药瓶 → 0000000010
  • 1000 号药瓶 → 1111101000

# 步骤 2:小白鼠喝药

  • 每个药瓶的二进制位对应一只小白鼠。
  • 如果该位是 1,则给对应的小白鼠喂这一瓶药,否则不喂。
  • 例如:
    • 1 号药瓶(0000000001)→ 只喂第 10 只小白鼠。
    • 2 号药瓶(0000000010)→ 只喂第 9 只小白鼠。
    • 1000 号药瓶(1111101000)→ 1-5、7 只小白鼠都会喝到这一瓶药。

# 步骤 3:24 小时后观察小白鼠的生死情况

  • 记录哪些小白鼠死亡,哪些存活,并按 二进制位顺序 组合成一个 10 位的二进制数。
  • 这个二进制数就是毒药瓶的编号。例如:
    • 如果第 1、3、5 只小白鼠死亡(其余存活),那么死亡的二进制码是 1010000000,转换成十进制就是 640,说明 640 号瓶子是毒药

# 最少实验次数

整个实验 仅需 1 次(24 小时)。

# 方案总结

  • 本质:利用二进制编码,将 10 只小白鼠的生死状态转换为唯一的药瓶编号。
  • 最少实验次数:1 次(24 小时内确定唯一毒药瓶)。
  • 最大可测范围:如果有 N 只小白鼠,最多可检测 (2^N - 1) 瓶药水。
  • 扩展:如果允许 48 小时(即 2 轮实验),则可用 信息熵最大化策略 进一步优化可检测的瓶子数量。

# 相关面试题

  • 如果有 2000 瓶药水,仍然只有 10 只小白鼠,如何优化实验策略?
  • 如果毒药不是立即生效,而是需要 2-3 天才能导致小白鼠死亡,该如何调整策略?
  • 如果能多次实验,但仍要尽快找到毒药,如何设计最优实验方案?

这个问题体现了 信息论、位运算、搜索优化 等思想,是经典的面试智力题。