1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。问最少需要多少只老鼠可在一周内找出毒酒?

如题。

分析思路:
要用尽可能少的老鼠完成相对大的任务量,要想到把问题进行对数分解
从而不难想到 210=10242^{10}=1024210=1024 这个数量关系。

解法一:
二进制编码。

首先对1000桶酒按照1~1000进行二进制编码,因为 2102^{10}210 = 1024 > 1000,因此需要10位二进制。
故只需要取10只老鼠,每只老鼠只喝其对应位数为1的编号的酒。

然后给10只老鼠按以下编码:
第一只 0000000001
第二只 0000000010
第三只 0000000100

第十只 1000000000

结果举例:编号为1000100011的酒是毒酒。
则对应喝酒的只有第一只,第二只,第六只,第十只死亡。

故最后可从哪几只老鼠死亡来判断毒酒的编号是多少。

通用公式:
N桶酒,老鼠所能表示的状态数目为M,则需要的老鼠个数为: K=logMNK =log_M{N}K=logM​N。

而具体实验的操作方法为:
1.每种状态按照 M 进制进行编码,编码长度为 K
2.每个老鼠分别去拿自身的 M 中状态去实验 N 的 M 进制编码的某一位
3.所以 K 个老鼠,等同于是 K 长度 M 进制的对应的每一位
4.这样试验完后,就确定了每一位上面的数字,找到对应的那种状态就好。

解法二:
二分法。

具体喝法如下:
第一只:1-500
第二只:1-250,501-750
第三只:1-125,251-375,501-625,751-875

因为2102^{10}210>1000 , 292^{9}29<1000

所以最少需要10只老鼠。


触类旁通:

初级版问题——每只只能实验一次

即上题。因为每只老鼠只能实验一次,所以,每只老鼠身上有两种状态一死亡或者存活,而酒中有毒的信息总量为1000,即每桶酒都有可能有毒。

所以需要的编码长度为:log21000log_ 2 {1000}log2​1000 向上取整得到10

中级版问题一一每只可以实验多次

10000桶酒,其中1桶是毒酒;48小时后要举行酒会;毒酒喝下去会在之后的第23-24小时内毒死人(时间确定);国王决定用囚犯来试酒,不介意囚犯死多少,只要求用最少的囚犯来测试出哪一桶是毒酒,问最少需要多少囚犯才能保证找出毒酒?

根据题目要求,对于每个囚犯,是可以实验24次的,即第0小时喝,然后第1小时再喝,。。。如果第K小时死亡,则是因为第K-24(上取整)小数喝的酒导致的。

这样的话,每个人就含有了25个状态,即24小时分别每个小时死亡,外加最后没有死。

所以需要的囚犯数为 log2510000log_{25}{10000}log25​10000 = 3, 即将10000桶酒按照25进制编码进行编码,是一个三位数长度的25进制数。

然后三个人分别第i小时去喝对应位数上编码为i的所有酒,最后就能确定下来具体喝哪一桶酒。

类似的题:
1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?

解:每头猪有5种状态,所以5头猪即可完成编码。

高级问题—-不止一桶有毒

不止一桶有毒的情况下,其实非常地复杂。

1000桶水中两桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到毒水,至少需要几只猪?如何实现?

因为有两桶有毒,所以信息量为:N=C10002N = C _ {1000}^{2}N=C10002​种情况。
每只猪身上有5种状态,所以最低有:log5N=9log_{5}{N}= 9log5​N=9 。
但是这个只是理论下界,因为猪死亡是不能够区分出,是被一桶毒水毒死的,还是两桶毒水。

假设猪死亡的状态可以区分出来/或者两种毒水需要混合才能有毒性的话,那么做法是,将这1000桶毒水两两混合,一共 N=C10002N = C _ {1000}^{2}N=C10002​ 种组合,然后将这些组合按照5进制进行编码。然后9只猪就可以区分出来了。

而对于这道题来说,不止一桶水有毒的情况,就是先用交叉法再用进制法。
即10只猪每只喝100桶,然后按照死一只还是死两只进行分开讨论。

具体如下:
1.给每只猪喂对应个位数编号的水,这样第一个15分钟后肯定最多死两只猪。

2.1.如果死了两只猪的话,则同时确定了两个[100桶水里有一桶水有毒]。问题简化成两个[100桶水里有一桶水有毒],45min确定哪两桶。
将剩下八只猪平均分开,思考可以用几进制的四位数至少可以表示到100,分别确定这桶水。因为 444^{4}44>100,刚好每只猪剩4种状态,所以两步一共需要10只猪。

2.2 如果仅死一只猪的话,问题变成100桶水里两桶有毒,45min确定哪两桶。
利用1思路,给剩下的猪每只喂12桶水。

2.2.1若死两只猪(此时还剩下7只猪),则问题简化成两个[12桶水一桶有毒],30min确定。
因为 333^{3}33>12,所以刚好将剩下的猪分成33两组。

2.2.2若死一只猪(此时还有八只猪),问题变成12桶水里两桶有毒,30min确定哪两桶。
利用1思路,给剩下的猪每只喂2桶水。

2.2.2.1若死两只猪(此时还有六只猪),问题变成两个[2桶水里一桶有毒],15min确定哪两桶。

2.2.2.2若死一只猪(此时还有七只猪),问题变成2桶水里两桶有毒,15min确定哪两桶。

故而此方法10只是最多的。


可利用 二进制编码 解法的又一种题目:

500张多米诺骨牌整齐地排成一列,依顺序编号为1、2、3…499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走所有奇数位置上的骨牌,依此类推。请问最后剩下的一张骨牌的编号是多少?

如题。

所有骨牌都可以用一个9位的二进制编码来标记。

题目中,第1次取牌抽走了所有末位是1的牌,剩余末位为0的牌;第2次抽牌则在第一次剩余的牌中抽走倒数第二位为1的牌…

以此类推,第k次抽牌留下的是形如XXX…X000…0(k个0)的牌。

因此,最后一次抽牌留下的是二进制编码为100000000,即十进制256的牌。

小鼠试毒问题(二进制)相关推荐

  1. 面试题——二进制相关(最小白鼠试毒问题)

    面试题--二进制相关(最小白鼠试毒问题) 题目 解题思路 总结

  2. 兔子试毒 #算法学习

    每日一题 Day1 兔子试毒 #每日一题 Day2 排序算法-插入排序 #每日一题 Day3 排序算法 #每日一题 Day1 题目引入 兔纸试毒 网络答案思路 设计题目 开始解题 实验准备 实验算法 ...

  3. LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法

    题目地址:Poor Pigs - LeetCode There are 1000 buckets, one and only one of them is poisonous, while the r ...

  4. 二进制老鼠毒药c语言,趣味算法:老鼠试毒瓶问题

    大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药.任何喝下毒药的生物都会在一星期之后死亡.现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪 ...

  5. 智力题------小白鼠试毒问题

    问题描述 有1000瓶水,其中有1瓶是有毒的.小白鼠喝了有毒的水之后24个小时就会死亡,问最少需要多少只小白鼠进行实验,才能在24小时内检测出哪瓶水有毒? 问题分析 如果没有时间限制的话,我们只要让一 ...

  6. 模拟100只老鼠试毒题目,根据酒桶数量生成对应的老鼠数量,选中老鼠,找出对应的毒酒

    前言 有100瓶酒,其中有一瓶是毒酒,最少用多少只老鼠,能找出这瓶毒酒 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): <!DOCTYPE html> <html ...

  7. 试毒水(阿里巴巴腾讯搜狐笔试智力题)

    问题描述: 例1:(阿里巴巴)有16瓶水,其中有一瓶有毒,小白鼠喝一滴水之后一个小时会死,请问至少用几只小白鼠,在1小时内一定可以找出至少14瓶无毒的水? 分析:将16瓶水分别标号为1~16,2瓶为一 ...

  8. 有趣问题——小白鼠试毒

    问:有1000瓶药水,其中只有一瓶有毒.现在用小白鼠进行实验,小白鼠只要服用任意量有毒药水就会在24小时内死亡.问至少要用多少只小白鼠进行实验才能检测出哪瓶药水有毒? 答: 给1000个瓶分别标上如下 ...

  9. 达拉崩吧的酒宴 | 感受算法的魅力

    1. 达拉崩吧的酒宴 成绩 10 开启时间 2019年07月29日 星期一 10:00 折扣 0.8 折扣时间 2019年08月6日 星期二 00:00 允许迟交 否 关闭时间 2019年10月8日 ...

最新文章

  1. linux sh for ls,Linux shell for while 循环
  2. 数据结构和算法:(3)3.2.2单链表的整表删除
  3. 用tigervnc远程控制centos x64 6.2
  4. c语言鼠标环绕特效,C语言写的鼠标有残影,急需解决方案,在线等待!
  5. win7电脑删除文件特别慢怎么办
  6. git rebase 合并中间的提交
  7. JNI 之 HelloWorld
  8. apk 泊车摄像头_【实测】 有了这款360全景泊车神器 新司机秒变老司机
  9. Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
  10. Python模块安装:Python3安装pdfminer3k
  11. mac下删除ntfs下的文件垃圾篓清空不干净的解决办法
  12. PyQt5开发桌面程序二(获取公网ip)
  13. 找工作神器,提取各大网站有效的招聘信息(前程无忧、智联招聘、猎聘网)
  14. 嘛:如何远视 还有遥远的未来
  15. MATLAB在安装时需要选择安装的产品
  16. 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树
  17. 大数据周周看:前英特尔高管加入谷歌云部门,网易与威马汽车合作打造“互联网+”时代智能汽车
  18. 批处理之批量修改文件扩展名
  19. CVPR2017 | G-RMI_Google大佬构建的姿态估计baseline
  20. 6个大厂Offer,牛逼!

热门文章

  1. 1705. 吃苹果的最大数目(贪心、优先队列(堆)、哈希表),总之先吃快烂的苹果
  2. CornerNet: Detecting Objects as Paired Keypoints 论文笔记
  3. Unity中EnableDisableComponent的用法
  4. python第七章_python教程(第七章)
  5. 1688商品详情SKU
  6. VS2019 error C2855: 命令行选项“/source-charset”与预编译头不一致(Charsets inconsistent with precompiled heade)
  7. PLC模拟量输入 模拟量转换FC S_ITR
  8. 提示the windows installer service could not be accessed
  9. 钱宝网可靠吗? 不信可以先试用后在说
  10. htc+m8+wp+android,WP8.1版HTC One M8官方配置全揭晓