【问题标题】:Optimizing on the number of days to find a poisoned cookie优化发现中毒 cookie 的天数
【发布时间】:2026-02-09 13:10:02
【问题描述】:

我的一个朋友在面试时被问到这个问题,当时无法解决。以为我会分享相同的。

有一千个巧克力饼干,其中一个中毒了。你 每天可以接触 10 只实验室老鼠。每只老鼠可以啃任何数字 饼干和每个饼干可以被任意数量的老鼠啃。后 一只老鼠咬着一块有毒的饼干,需要一天的时间才能看到 如果老鼠中毒了,对老鼠的影响。

优化天数。我能够想出一个算法在 2 天内找到中毒的 cookie,尽管我相信有一种方法可以在 1 天内做到这一点

【问题讨论】:

  • 相当病态的面试问题(除非我猜他是否正在申请为害虫防治公司工作)。
  • browsoffire 和 Neil 都有(它们是同一算法的替代描述。)
  • 我几乎要举报这个虐待动物的问题了...
  • 为了完整起见,您能写下您的 2 天解决方案吗? (现在答案中既有 3 天解决方案,也有 1 天解决方案?)

标签: algorithm


【解决方案1】:

这是三天之内的“简单”解决方案:

  • 首先,让每只老鼠啃 100 块饼干。
  • 一天后,让每只老鼠吃掉 10 块死老鼠吃掉的饼干。
  • 两天后,让每只老鼠吃掉第二只死老鼠吃掉的饼干。
  • 三天后,您就会知道哪个 cookie 中毒了。

现在是一天之内的“硬”解决方案:

  • 以二进制对所有 cookie 进行编号。
  • 每只老鼠都要啃咬那些其二进制表示在老鼠的索引处有一个设置位的cookie。例如,老鼠 1 会啃掉所有奇数的 cookie。
  • 换句话说,饼干 37 会被老鼠 1、3 和 6 啃。所以如果这三只老鼠在第二天死了,你就知道饼干 37 是被毒死的。

【讨论】:

  • 仅仅用二进制编号一千个cookie可能需要半天时间,但这是一个很好的解决方案!
  • @SimonAndréForsberg 事实上,“简单”的解决方案的优点是测试人员只需最少的努力。
【解决方案2】:

我想我明白了。

想象一棵以 1024 个 cookie 为根的二叉树(这个数字更清晰,但它适用于任何小于 1024 的数字)。将 1024 个 cookie 分成两组,每组 512 个,每组都是根的孩子。然后将这些 512 组中的每一个分成 256 组,并让它们成为每个组的孩子,依此类推。您应该最终得到 11 层树。

将每只老鼠分配到除根之外的树的一个级别。每只老鼠只会吃掉他们关卡左边树枝上的饼干。第二天,遍历树,对于每只死去的老鼠,跟随左分支,对于每只活着的老鼠,跟随右分支。生成的 cookie 应该是中毒的。

【讨论】: