1000瓶药水和10只老鼠的问题及其扩展
一,常规的问题
问题背景:
1000瓶药水,有一瓶有毒,小老鼠喝下去之后会在1小时死亡。问给你一小时你需要多少只老鼠才能检测出那瓶是毒药?
分析问题:
最优的方法是进制法去求解。因为时间是一个小时在喝下药水之后小老鼠的状态有生和死两种状态,对应着二进制中的0和1,因此可以用二进制的想法去求解。因为
2^10=1024
所以需要10只老鼠就可以检测出毒药。先给出解法步骤:
解法:1,将1000瓶药水按照二进制进行标记;2,定义10个符号位,从左至右分别为符号位1....10,每个符号位为0或者1。10只老鼠按照从左到右的位置,代表每一个符号位的位置;3,对于每个老鼠按照如下操作:喝其相应位置中序列为1的药水,如果一个小时候老鼠死了,那么该序列为1,如果没死,则该序列为0.4,最后得到每个序列对应的数字就是有毒的那瓶药水的二进制编码。
懵逼吧。举个栗子就好理解了。问题简化成4瓶药水,两只老鼠,来看看。
两只老鼠A,B;4瓶药水00,01,10,11
答案:_ _
目标是求出答案中两个符号位的数字。假设现在有毒的是10;
A表示左一位置的状态,B表示左二位置的状态。
A喝第一位置中序列为1的药水,就是10,11,结果死了(因为10有毒),那么左一的符号位是1;
B喝第二位置中序列为1的药水,就是01,11,结果没死,那么左二的符号位是0;
最后得到有毒的是标记为10的那瓶,跟我们设置的一样。
还不明白的可以调换一下有毒的瓶子,再自己推演一下就能明白了。
二,一个问题
明白的继续往下看,想一个问题:为什么死的时候置为1,生的时候置为0 ?
这个问题很关键,如果明白了这个问题,下面的扩展就很容易理解了了。
如果你觉得我把这个问题想明白了,那恐怕你要失望了,我没有完全弄懂。
不过我知道设置为1还是0是跟小老鼠喝药水的序列号是相关的,如果喝的是序列1的那么死为1生为0;如果喝的是序列0的那么死为0生为1.得到的结论就是:喝序列号是多少,那么死就设置成该序列号。
不相信的可以以上面两只老鼠4瓶药水为例,以喝序列号为0,死为0生为1,推演一遍。
三,问题扩展
记住上面的结论:小老鼠喝序列号是多少,那么死就设置成该序列号
继续看问题的扩展:
1000瓶药水,有一瓶有毒,小老鼠喝下去之后会在1小时死亡。假设现在给你两个小时你需要至少需要多少只老鼠能检测出那瓶是毒药?
还是以进制法为基础进行分析:
小老鼠在喝完药水一个小时之后会产生状态,那个两个小时小老鼠会有多少状态?
答案是三种。即,死,生死,生生。
以生死为例,表示小老鼠喝完药水一个小时之后活蹦乱跳的,再继续和药水一个小时之后死了。其他两种情况可以自己推算到。
那么就是说老鼠有三种状态,则可以用三进制的思路去考虑问题了。因为
3^5=243>100
因此理论上5只老鼠就可以算出哪瓶有毒。解法如下:
解法:1,将1000瓶药水按照三进制进行标记;2,定义5个符号位,从左至右分别为符号位1....5,每个符号位为0,1或者2。5只老鼠按照从左到右的位置,代表每一个符号位的位置;3,对于每个老鼠按照如下操作:喝其相应位置中序列为0的药水,如果一个小时候老鼠死了,那么该序列为0;如果没死,喝其相应位置中序列为1的药水,如果死了,则该序列为1,如果活着则该位置为2;
(因为一个小时能知道小老鼠的状态,因此两个小时可以喝两次药水)
4,最后得到每个序列对应的数字就是有毒的那瓶药水的三进制编码。
还是懵逼?没关系继续举个栗子就好理解了。问题简化成8瓶药水,两只老鼠,来看看。
两只老鼠A,B;4瓶药水00,01,02,10,11,12,20,21
答案:_ _
目标是求出答案中两个符号位的数字。假设现在有毒的是10;
A表示左一位置的状态,B表示左二位置的状态。
A喝第一位置中序列为0的药水,就是00,01,02,没死;继续和第一位置为1的药水,就是10,11,12,结果死了(因为10有毒),那么左一的符号位是1;
B喝第二位置中序列为0的药水,就是00,10,20,结果死了(因为10有毒),那么左二的符号位是0;
最后得到有毒的是标记为10的那瓶,跟我们设置的一样。
相信你已经看明白了吧。
那么如果再扩展一下,假定给了3个小时,100瓶药水至少需要多少只老鼠呢?
如果你看懂了肯定就知道答案了。
有什么不懂的欢迎下方提问。
网上解释的比较偏原理的连接:
http://blog.sciencenet.cn/blog-677221-669159.html
1000瓶药水和10只老鼠的问题及其扩展相关推荐
- 1000瓶水里有1瓶毒药,10只老鼠能试出来吗?
今天在网上看到一道题,据说是微软的测试题 当然能,只要1只老鼠就够了,让它一瓶一瓶地试,直至试出毒药. 不过,我们也要考虑效率,是不是?比如,毒药是1小时后才发作,那怎样用最短的时间来找出毒药? 我们 ...
- 1000瓶药中找出一瓶毒药,10只老鼠做试验
题目如下:现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药? 题解:这道题明显就是只能一开始就把所有药都喂给10只老鼠,1小时后就直接 ...
- D28 1000瓶药中找出一瓶毒药,10只老鼠做试验
题目:现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药? 解题: 这道题明显就是只能一开始就把所有药都喂给10只老鼠,1小时后就直接一 ...
- 1000瓶酒其中1瓶有毒,10只老鼠找出毒酒
1: 折半查找的方式 容易理解 500瓶每瓶1滴放在一起看老鼠喝了死不死 依次类推 250->125->63->32->16->8->4-& ...
- 10只老鼠与1000瓶药水
题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验.喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡.如何在一天之内(第二天)找出这瓶有毒的药水? 思路:10只小白鼠, ...
- 十只老鼠在1000瓶药水中找一瓶有毒的
/*** 十只老鼠试验一千瓶药水,只有一瓶有毒,怎么找出有毒的那瓶?** 1000,转为二进制为11 1110 1000,共十位,每只老鼠各对应一位,* 比如3的二进制为0011,第1.2上为1,就让 ...
- 1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验
1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验.喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡.如何在一天之内(第二天)找出这瓶有毒的药水? 看着网上给出的都是从二进制的 ...
- 1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。
1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. . 这道题知识点:二进制. 解题思路:2的10次方等于1024,1024以内的所有自然数 ...
- 1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?
题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验.喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡.如何在一天之内(第二天)找出这瓶有毒的药水? 第一次看这个问题完全 ...
- c语言:1000瓶水,有一瓶是有毒的,现共有10只老鼠,怎么判断毒水?
问题:1000瓶水,其中有一瓶是有毒的,一只老鼠喝下毒水会一天之后死亡,现在共有10只老鼠,怎么判断哪一瓶水是毒水? 分析:2^10=1024,则可以考虑利用二进制求解 解:给1000瓶水依次标号1至 ...
最新文章
- ifcfg系列命令配置网络属性
- 用GrabCut进行前景检测(对书中代码进行改进)Python
- 明明白白你的Linux服务器——硬件篇
- Flask练手项目之通讯录
- 中九天线调节经验总结
- CUDA精进之路(零):CUDA开篇
- bootstarp怎么使盒子到最右边_江湖救急!盒子显示“很抱歉Launchercust 已停止运行” ?...
- Jmeter html 报告中添加90% line time
- 从零基础入门Tensorflow2.0 ----三、8. 自定义层次
- 如何去掉腾讯网址安全中心提醒
- adb 安卓模拟器 进程端口_Frida初体验安卓CTF逆向
- Zoom会议使用指南
- 如何实现阿里云短信接口使用短信业务
- C语言基础入门:C-Free5新建C语言工程
- matlab仿真项目心得,Matlab与Simulink系统仿真学习心得
- win7用友u8安装教程_如何在win7系统中安装用友u8(图文)
- 署任DS.ENOVIA.DMU.NAVIGATOR.V5-6R2017.GA.WIN64数字制造解决方案
- 选型笔记之二极管选型
- 迅雷CTO李金波的一篇文章,给自己 mark 下一个指引吧!
- 什么软件可以提取视频中的音频制作成手机铃声