1.故事起源

有1000瓶药水,其中一瓶是有毒的,老鼠喝掉药水后,毒性会在24小时后发作。那最少需要多少只老鼠,能够在24小时后找出哪一瓶有毒呢?

2.思考小规模场景

先考虑小规模的问题会是怎样的呢?

2瓶药水
只需要1只老鼠,喝掉其中一瓶。24小时后老鼠死了,就是喝掉的这瓶有毒,否则是另一瓶。

4瓶药水
只需要2只老鼠

8瓶药水

只需要3只老鼠

相信聪明的你已经看出来了,这不就是二分的思想吗?

问题建模
如果把喝掉的药水用1表示,没喝的用0表示。
每一列就是一个二进制数字,对应的十进制数正好等于药水的编号。

结果查找
每一只老鼠最终都只有2种状态,“活”和“死”,把3只老鼠的状态建成一棵树,就成了一棵满二叉树。
从根节点到叶子节点的每个子路径,也正好对应了药水的编号。

老鼠死了有毒的肯定是在喝掉的药水中,也就是对应为1的节点,没死就是没喝有毒的,也就是对应为0的节点。这样根据24小时后所有老鼠的状态,就可以唯一确定哪一瓶有毒啦。

所以可以看出,二分、二进制、二叉树是有着本质的联系。二分的思想在计算机算法中非常重要,以后也会多次提到,大家可以从多个角度思考问题,深入理解“二”的意义。

如果有人说世界由01组成,也不为过啊。。。

3.还原1000瓶

1. 给1000瓶药水按0-999编号,把十进制转为二进制,每一只老鼠喝掉对应为1的药水。

2. 再根据老鼠“死活”的状态确定药水的编号。

总共需要10只就够了,

4.代码实现

4.1 十进制/二进制互转

4.2 代码如下:

int length = 0, a[11] = {0};
void transform10to2(int n, int &length, int a[]) {while (n) {a[length++] = n & 1;n >>= 1;}
}int transform2to10(int &length, const int a[]) {int i = 0, k = 1, ans = 0;while (i < length) {ans += a[i++] * k;k *= 2;}return ans;
}

关注我,涨知识,公众号:几何思维

往期精彩回顾

经典逻辑面试题,高楼扔鸡蛋

马老师的烦恼

通过6人介绍可以认识世界上任何一个人?

1000瓶药水,其中1瓶有毒,最少要几只老鼠?相关推荐

  1. 2021-08-27 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?

    题目: 现在有1000瓶药水,其中一瓶有毒,一只老鼠喝了在24h后会准时死亡,药水无色无味,如何用最少的老鼠在24h内找出毒药? 分析: 时间限制为24h,说明我们只有一次喂老鼠的机会,需要一波找出来 ...

  2. 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?

    题目: 现在有1000瓶药水,其中一瓶有毒,一只老鼠喝了在24h后会准时死亡,药水无色无味,如何用最少的老鼠在24h内找出毒药? 分析: 时间限制为24h,说明我们只有一次喂老鼠的机会,需要一波找出来 ...

  3. 1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药

    1000瓶药水,1瓶有毒药,服用后一小时毒发,毒药可以无限稀释,那么一小时内用几只小白鼠能够找出毒药? 假如是8瓶药水,3只小白鼠. 000=0 001=1 010=2 011=3 100=4 101 ...

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

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

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

    面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. 1.  知识点:二进制. 解题思路:此题考察的是二进制.2的10次方等于1024 ...

  6. 一千瓶酒有一瓶酒有毒药,问你最少用多少只老鼠可以找出那瓶毒酒? 老鼠毒发的时间在两小时内,要求在两个小时内找出毒酒。

    题目: 一千瓶酒有一瓶酒有毒药,问你最少用多少只老鼠可以找出那瓶毒酒? 老鼠毒发的时间在两小时内,要求在两个小时内找出毒酒. public class Demo03 { public static v ...

  7. 10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒;

    10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒: 分析,杯子1-10用二进制分别表示为 第一杯: 0000001 第二杯: 0000010 第三杯: 0000011 第四杯: 00 ...

  8. 计算机求职面试智力题:找毒药(一共n瓶水,仅有一瓶是毒药),求至少需要多少只老鼠/猪;或者求x只老鼠/猪最多可以搜索多少瓶水

    先说结论: 假设仅1瓶存在毒药的情况下,x只老鼠/猪只经过一次测试最多可以从2^x瓶里找出来: 其加强版本,假设仅1瓶存在毒药的情况下,若一只老鼠/猪喝下后会在m分钟后死去,限时要在p分钟内寻找出来, ...

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

    如题. 本题考查的是二进制编码问题. 如对1000桶按1~1000编码,需要10位二进制数. 因此只需要取10只老鼠,每只老鼠只喝其对应位数为1的编号的酒. 即10只老鼠按以下编码: 第一只 0000 ...

  10. 1000瓶毒药里面只有1瓶是有毒的,毒发时间为24个小时,问需要最少需要多少只老鼠才能在24小时后试出那瓶有毒。

    答案是最少10只. 看了网上很多解释(思考方向都不一样). 这里直接上图就知道了. 老鼠的编号,就相当于一个二进制bit位. 喝和不喝酒代表1喝0. 对于二进制占位,死亡和存活的排列组合就是唯一的.

最新文章

  1. Nature子刊:精胺介导稻瘟病菌侵染水稻叶片的新机制!
  2. 如何将Dictionary绑定到Repeater?
  3. pjax 历史管理 jQuery.History.js
  4. python离群点检测例子_异常点/离群点检测算法
  5. volatile的作用(转自于http://www.csdn.net/)——今天差点忘记了!
  6. 响应性web设计实战总结(二)
  7. [Hands On ML] 8. 降维
  8. 情人节海报设计没有灵感?看过来
  9. 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
  10. 容易被PHP程序员忽视的几个要点
  11. 【NOI OpenJudge】【1.1】编程基础之输入输出
  12. 如何获取最好权限删除顽固文件Mac系统
  13. SVN迁移IP变更地址修改relocate
  14. 华中农业计算机硕士就业,华中农业大学好就业吗?附华中农业大学就业率最高的专业名单...
  15. excel 删除重复项_在Excel 2007中删除重复项
  16. git github 快速入门
  17. win8计算机可用内存不足,Win8.1频繁提示内存不足是怎么回事
  18. 数学归纳法产生的历史背景
  19. 单云台语音跟踪摄像机MHD-G200TH
  20. 10月3日 c语言 输入4*5矩阵

热门文章

  1. SLM2110 600V 2A 逆变电源专用芯片替代IR2110S 移动储能解决方案
  2. 程序员做外包有前途吗?
  3. 网易编程题之地牢逃脱
  4. 易语言html5内核,精易Web浏览器支持库易语言版
  5. win7计算机名称格式,win7笔记本电脑如何显示文件扩展名
  6. linux 修改文件日期,Linux系统如何修改文件的时间
  7. 弘辽科技:限制店铺流量上涨的七大原因
  8. 风寒感冒和风热感冒的药膳方
  9. 深入 CoreML 模型定义
  10. 高等数学:第六章 定积分的应用(2)平面图形的面积