今天在网上看到一道题,据说是微软的测试题

当然能,只要1只老鼠就够了,让它一瓶一瓶地试,直至试出毒药。

不过,我们也要考虑效率,是不是?比如,毒药是1小时后才发作,那怎样用最短的时间来找出毒药?

我们的目标就是,不算配药的时间,1小时搞定。

学过的朋友,直接用结论就可以算出。

没学过的朋友,就让我们一起用数学家的思维方式来探究这道题。

一、从少到多,从简到繁

(1)先从1只老鼠开始,最多可以试几瓶?

1号瓶有毒,则1号鼠毒死。

2号瓶有毒,则1号鼠活着。

小结:

此方法,可得出一个重要思路,最后一瓶空着,不需要老鼠试药,如果有老鼠毒死,此瓶无毒;如果其他老鼠都活着,此瓶有毒.

(2)2只老鼠呢?先想想

3瓶?

别急着下结论,看看能不能再加一瓶?看下图

是不是很有意思?

1号鼠和2号鼠都试3号瓶,如果2只都毒死,才能说明3号有毒;

反之,只有1只死了,或2只都没死,则3号无毒。

小结:

这又给了我们一个启示:可以让2只老鼠,都试一瓶相同的水,如果这2只鼠都被毒死了,说明这瓶有毒;反之,此瓶无毒。

归纳目前得到的结论,猜想3只老鼠最多可以试几瓶?

6瓶? 8瓶?

2组数据不形成规律,我们继续!

(3)3只老鼠最多可以试几瓶?

根据前面总结的

结论1:最后一瓶空着。

结论2,让2只老鼠试相同的一瓶。

可我们得到如下方法。

居然既不是6瓶,也不是8瓶,而是7瓶!这怎么回事?

我们先观察、分析。

1,2,3号瓶,都是只给1只老鼠吃。

4,5,6号瓶,都是同时给2只老鼠吃。

那………,我们是不是可以弄一瓶同时给3只老鼠吃?

如果3只老鼠都死了,不就说明这瓶有毒吗?

对方法进行改进,如下图,是8瓶!

原来的结论2:让2只老鼠试相同的一瓶。

拓展为:可以让n只老鼠试相同的一瓶。

看,我们在尝试中,不停地总结和归纳。是不是有点数学家的思维方式了?

总结当前的结论

二、分析、归纳:

聪明的朋友是不是很快归纳出规律了?

10只老鼠,最多可以试1024瓶,那1000瓶当然可以试出来了。

推理到这一步,对大部分人来说,已经足够了。尤其对小学生而言,能进行这样的推理已是相当不错了,是佼佼者了

三、深入探究

我们继续探究,尝试用定理或公式来推导验证,使结论在逻辑上更加严谨。

首先回顾前面的过程!回到3只老鼠的方法图

根据公式

如果再增加1瓶,这1瓶,给1只老鼠、2只老鼠、3只老鼠试药,都会出现和原来重复的组合,导致无法区分。因此不能再增加。因此8瓶是最大的。

依照这个方法再计算10只老鼠:

N只老鼠,同理可证。

四、拓展应用——二进制编码

以3只老鼠举例。把这个图稍微变动一下,将瓶子的编号清空,只留下颜色。

涂色表示给老鼠试药,空白表示不试。

现在开始重新编号,将图中的涂色部分用的“1”表示,空白部分用“0”表示,再将二进制改成对应的十进制。

需要用到的二进制编码是“000~111”,对应的十进制编码是0~9,正好一共8个。

下面,我们再换个角度来分析,

假如我们给每只老鼠都有选择的权利,老鼠也不知道这是毒药还是糖水,把1瓶药水拿到10只老鼠的面前,让它们自由选择,它可以选择喝或者不喝。

喝记为“1”,不喝记为“0”,就这两种情况。10只老鼠,每只老鼠都有2种选择。

根据计数原理。很容易知道,一共有2^10=1024种选择情况,就是可以试1024瓶药水。

什么?你说如果选择情况出现雷同怎么办?那就让它重选,直到不重复为止!

比如,我们把1瓶药水拿到10只老鼠的面前,2号鼠,5号鼠,9号鼠“自由”选择了喝,其他老鼠没有选择。

对应的二进制编码为:0100100010,转换成十进制就是290。我们就知道290号药瓶,是哪些老鼠在试药了。

二进制编码从0000000000到1111111111,对应的十进制编号为0~1023,一共1024个。

二进制编码,最妙的用处在于,可以对每瓶进行编号,可以清楚地知道每一瓶是给了哪些老鼠尝试的,也更加方便于计算机编程使用。


结束

1000瓶水里有1瓶毒药,10只老鼠能试出来吗?相关推荐

  1. [面试题]1000瓶水中有1瓶是有毒的,问需要多少只老鼠才能试出那瓶有毒?

    问题描述: 1000瓶水里面只有1瓶是有毒的,毒发时间为1个小时,问需要多少只老鼠才能在1小时后试出那瓶有毒. 相关资料: Bloom Fliter 算法 参考思路: 210 = 1024 > ...

  2. c语言:1000瓶水,有一瓶是有毒的,现共有10只老鼠,怎么判断毒水?

    问题:1000瓶水,其中有一瓶是有毒的,一只老鼠喝下毒水会一天之后死亡,现在共有10只老鼠,怎么判断哪一瓶水是毒水? 分析:2^10=1024,则可以考虑利用二进制求解 解:给1000瓶水依次标号1至 ...

  3. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?

    1.有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒. 我来解释一下,并给出一个方案,时间不是问题,24小时内肯定可以找出 ...

  4. 1000瓶有毒的水,用多少只老鼠可以试出有毒的那瓶

    文章目录 信息论解法 二分法解法 二进制解法 信息论解法 信息论解法得不到过程,只能得到结论 老鼠只有两种结果,死或者不死,当这两种可能相等的时候,可以得到最大的信息量,log2 = 1比特.设法让每 ...

  5. 1000瓶水,哪一瓶有毒?

    问题: 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒. 解答: 方法1: 用1000只小白鼠,每只喝一瓶:这很简单,但 ...

  6. 1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。

    1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. . 这道题知识点:二进制. 解题思路:2的10次方等于1024,1024以内的所有自然数 ...

  7. 1000瓶药中找出一瓶毒药,10只老鼠做试验

    题目如下:现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药? 题解:这道题明显就是只能一开始就把所有药都喂给10只老鼠,1小时后就直接 ...

  8. D28 1000瓶药中找出一瓶毒药,10只老鼠做试验

    题目:现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药? 解题: 这道题明显就是只能一开始就把所有药都喂给10只老鼠,1小时后就直接一 ...

  9. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡

    有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?

最新文章

  1. 如何撰写对用户有吸引力的标题
  2. 左手供给,右手营销,聚划算99大促首战告捷的下沉市场进攻方法论
  3. Zookeeper的简介及命令行操作
  4. linux设备进入睡眠所需时间,android linux 休眠 深度睡眠 查看 方法 调试【转】
  5. Python -- abc module
  6. matlab中投影,MATLAB在极射赤平投影中的应用
  7. C# 最简单的异步委托
  8. python自动化中使用unittestreport输出测试报告
  9. 软考_2021年11月真题2__三点估算技术
  10. 计算机操作日志文件,教你完全读懂Windows日志文件
  11. 数字取证之Autopsy ——合天网安实验室学习笔记
  12. 如何在最短的时间内完成立春主题的公众号图文排版?
  13. jetbrains projector远程开发使用入门
  14. 又双叒叕可以 4 折买书了!!来薅羊毛了!
  15. 冯唐:职场人35岁以后,方法论比经验重要
  16. 买了腾讯云服务器怎么ping,腾讯云服务器如何禁止Ping的功能
  17. centos7 杀不死 httpd (Apache )
  18. ubuntu清除cuda缓存
  19. netty的epoll和linux的epoll是如何实现的
  20. java类型转换的例子

热门文章

  1. 怎么批量转换图片格式?这些方法帮助你一键转换
  2. setup界面的network configuration 进不去的原因
  3. pdf的base64转成jpg的base64
  4. 微信已经成为电商最重要的一个通道
  5. SQL Developer的下载、安装和连接Oracle数据库
  6. Ubuntu安装xxx依赖错误解决方法
  7. Git版本控制管理——基本Git概念
  8. 最小二乘法求模型最优解
  9. java模拟HTTP请求(集合了网上搜来的各种)
  10. javascript高级编程教程,javascript基础入门案例