小鼠试毒问题(二进制)

2023-05-16

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

如题。

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

解法一:
二进制编码。

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

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

第十只 1000000000

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

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

通用公式:
N桶酒,老鼠所能表示的状态数目为M,则需要的老鼠个数为: K = l o g M N K =log_M{N} K=logMN

而具体实验的操作方法为:
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

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

所以最少需要10只老鼠。


触类旁通:

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

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

所以需要的编码长度为: l o g 2 1000 log_ 2 {1000} log21000 向上取整得到10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.2.1若死两只猪(此时还剩下7只猪),则问题简化成两个[12桶水一桶有毒],30min确定。
因为 3 3 3^{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的牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小鼠试毒问题(二进制) 的相关文章

  • win下配置pytorch3d

    一 配置好的环境 xff1a py 3 9 43 pytorch 1 8 0 43 cuda 11 1 cudnn 8 0 43 pytorch3d 0 6 0 43 CUB 1 11 0 你可能觉得pytorch3d 0 6 0版本有点低
  • 【pytorch3d】running build_ext error: [WinError 2] 系统找不到指定的文件

    在win10上安装pytorch3d时 xff0c 遇到如下错误 xff1a running build ext error span class token punctuation span WinError span class tok
  • windows下安装jax

    一 首先下载jaxlib 需要去这个非官方网站去找到适合自己的版本 xff0c 下载到本地 然后使用对应的虚拟环境pip install 该文件名即可 二 然后下载对应的jax 一行命令即可 pip span class token fun
  • STM32 HAL库串口收发数据

    STM32 HAL库串口收发数据 许多传感器的使用方法是 xff1a 单片机给传感器发送一帧数据 xff0c 然后传感器返回单片机一帧有用数据 xff0c 所以串口的收发功能十分重要 STM32cubeMX的配置 时钟和下载方式就不讲了 串
  • W7,显卡型号nvidia geforce 840M,安装tensorflow-gpu

    记录一下 xff0c 以防忘记 1 首先我拿驱动精灵把显卡驱动升到最新 xff0c 然后在NVIDIA 控制面板里查看支持CUDA9 1 xff0c 但是我下载了CUDA9 0 43 cudnn7 0 xff0c 先不用安装 注意 xff0
  • IP和MAC的作用

    IP地址的作用以及MAC地址的作用 MAC地址是一个硬件地址 xff0c 用来定义网络设备的位置 xff0c 主要是数据链路层负责 IP地址是IP协议提供的统一的地址格式 xff0c 为互联网上的每一个网络和每一台主机分配一个逻辑地址 xf
  • SPI简介

    SPI全称是Serial Perripheral Interface xff0c 也就是串行外围设备接口 SPI是Motorola公司推出的一种同步串行接口技术 xff0c 是一种高速 xff0c 全双工的同步通信总线 SPI时钟频率相比I
  • npm 错误码 EMISSINGARG

    EMISSINGARG Error npm ERR node v6 6 0 npm ERR npm v3 10 3 npm ERR code EMISSINGARG npm ERR typeerror Error Missing requi
  • axios.response返回数据格式

    axios response接口中存储的是如下内容 xff1a 96 data 96 是服务器的提供的回复 xff08 相对于请求 xff09 data 96 status 96 是服务器返回的http状态码 status 200 96 s
  • flask实现下载文件、前后端

    采用前后端分离的过程中 xff0c 前端只能下载静态文件中的文件或者url下载文件 但是 xff0c 一般情况下文件要么是远程或者存在于其他文件夹 这种情况就需要采用后端预先下载文件 xff0c 传递给前端 flask有几种文件传输方式 x
  • python+flask 简单并发,使用gevent库

    pip install geventfrom gevent wsgi import WSGIServer 关键这个WSGIServer 127 0 0 1 5000 app serve forever
  • java中Array.remove()方法,源码中不对负索引进行检查

    public E remove int index 检查remove源码是 xff0c 发现 其中对index 的检查仅限于上溢出检查 没有显示的对下溢出进行检查 xff1f rangeCheck index modCount 43 43
  • java- 类名.this.成员 和 this.成员 的区别

    this 成员 xff1a this用于本类中 xff0c 自身的引用 xff0c 调用自身对象属性 类名 this 成员 用于内部内 xff0c 调用外部类的成员 用 外部类 this 表示外部类的引用 xff0c 用以 和 自身类进行区
  • java异常 Exception in thread “main“ java.lang.IllegalArgumentException: Comparison method violates its

    Exception in thread 34 main 34 java lang IllegalArgumentException Comparison method violates its general contract at jav
  • 速查matplotlib-python中画图曲线的形状和颜色

    速查matplotlib python中画图曲线的形状和颜色 在属性值先写颜色 xff0c 后写形状如 xff1a r 红色曲线 b 蓝色短横线 等 字符描述 39 39 实线样式 39 39 短横线样式 39 39 点划线样式 39 39
  • python-pyplot直方图,标注直方图数据

    话不多说 由于自己一直忘记直方图的一些细节 xff0c 经常不用 xff0c 老得百度 xff0c 干脆自己记下来好了 这是直方图的写法与标注直方图的数据写法 如下 from matplotlib import pyplot as plt
  • 从零开始学JetsonTX2----can bus开发

    step by step implementation 搞硬件开发 xff0c 先把技术手册搞到手 这个网页把几乎Jetson tx2的开发资料都汇总了一下 找教程开始配置can所需要系统环境 NIVIDA社区的教程 xff1a https
  • CAN总线详解

    目录 CAN 协议简介1 xff0c 何为CAN 1 1 CAN的应用实例1 2 总线拓扑图1 3 CAN的特点 2 xff0c CAN 电气属性3 xff0c CAN 协议3 1 数据帧3 2 遥控帧3 3 错误帧3 4 过载帧3 5 间
  • 内存对齐规则总结

    由于某些硬件平台不能任意访问地址数据 xff0c 只能在某些地址处取某些特定类型的数据 xff1b 并且处理器访问未对齐的内存时 xff0c 需要多次读取并对多余数据进行剔除 xff0c 相较于对齐内存访问 xff0c 耗费了更多的时间 x
  • 一些常用库的使用(CMAKE部分)

    opencv span class token function find package span span class token punctuation span OpenCV span class token number 3 1

随机推荐

  • 将RTKLIB编译成静态库

    rtklib编译 在写自己的程序时 xff0c 想要调用rtklib h xff0c 和它的一些文件来进行运行 xff0c 想要将rtklib编译成静态库安装在系统的目录下 xff0c 这样基于rtklib的二次开发就不用再使用源码了 xf
  • TIM_SetCompare2()

    对于 void TIM SetCompare2 TIM TypeDef TIMx uint16 t Compare2 的理解 void TIM SetCompare2 TIM TypeDef TIMx uint16 t Compare2 C
  • C语言语句YPR[0]=(BUF[1]<<8|BUF[2]),以及 >> 8 &0xFF如何理解?

    C语言语句 YPR 0 61 BUF 1 lt lt 8 BUF 2 如何理解 这是一个赋值语句 xff0c 把等式右边的值赋给左边 xff1b 先来看右边是怎么运算的 xff0c 由于移位运算符 lt lt 的优先级大于位运算符 xff0
  • word文档编辑时字体突然发生变化解决方法

    word文档在编辑时字体突然发生变化 xff0c 第1步 点击 开始 xff0c 图片中右下角 箭头 第2步 选择需要的字体 xff0c 第3步 设置默认字体 xff0c 确定
  • AD(Altium Designer)如何铺铜

    在PCB PcbDoc文件中 xff1a 在软件下方选择 34 Top Layer 顶层 34 xff08 1 xff09 执行 34 放置 34 gt 铺铜 xff1b 或者快捷键 34 PG 34 会弹出 34 Properties 属
  • 嵌入式硬件-读懂原理图

    学习硬件的第一节课 学习读懂原理图 读懂原理图对嵌入式软件工程师和程序员尤为重要 在深入细节之前请注意 对所有的嵌入式设计人员来说 能懂得硬件工程师创建和使用的来描述其硬件设计的原理图和符号是非常重要的 无论硬件设计得多么复杂 不管有多少设
  • 校招行测笔试-图形推理

    校招行测笔试 图形推理 面对校招笔试的行政能力测试 xff08 简称 行测 xff09 环节 xff0c 刚开始接触有些束手无策 摸不到头脑 xff0c 其实是有技可循的 xff0c 本文就帮助大家总结一下行测的相关技巧 如果对你有所帮助
  • 统一建模语言UML详解附思维导图

    UML图 概述 构成 事物 Things xff1a UML模型中最基本的构成元素 xff0c 是具有代表性的成分的抽象 构件事物 xff1a UML模型的静态部分 xff0c 描述概念或物理元素 类 xff1a 具有相同属性相同操作 相同
  • 比特率与波特率

    比特率 xff1a 单位 Bps bit per second xff0c 即每秒传输的 bit 数 波特率 xff1a 单位 Baud xff0c 即每秒传输的 码元 数 这里涉及到码元 码元 xff1a 持续一段固定时间的通信信道有效状
  • 嵌入式相关开源项目、库、资料------持续更新中

    学习初期最难找的就是找学习资料了 xff0c 本贴精心汇总了一些嵌入式相关资源 xff0c 包括但不限于编程语言 单片机 开源项目 物联网 操作系统 Linux 计算机等资源 xff0c 并且在不断地更新中 xff0c 致力于打造全网最全的
  • 嵌入式系统QNX概述-微内核架构进程管理安全性

    一 微内核架构 QNX操作系统由微内核以及一组协作的系统服务进程组成服务进程与操作系统内核是相互隔离开的 当服务进程出问题时并不会影响内核微内核提供软件总线供各个软件模块进行通信和协作内核只提供最小化的基础 公共服务高度模块化设计带来良好的
  • 三万字长文总结C语言规范

    1 头文件 若包含了头文件aa h xff0c 则就引入了新的依赖 xff1a 一旦aa h被修改 xff0c 任何直接和间接包含aa h代码都会被重新编译 如果aa h又包含了其他头文件如bb h xff0c 那么bb h的任何改变都将导
  • 操作系统概述

    Overview Q1 xff08 Why xff09 为什么要学操作系统 xff1f Q2 xff08 What xff09 xff1a 到底什么是操作系统 xff1f Q3 xff08 How xff09 xff1a 怎么学操作系统 x
  • 小白自学PIX飞控学习笔记

    小白自学PIX飞控学习笔记 xff08 二 xff09 接触飞控什么是MCU xff1f PIX飞控与MCU xff1f 无人机飞控的作用飞控内部如何实现其功能 xff1f 接触飞控 作为未入门 小白 一枚 xff0c 也只是简单地接触过C
  • Nestjs 返回req报错

    返回req存在循环引用 报错 ERROR ExceptionsHandler Converting circular structure to JSON gt starting at object with constructor Sock
  • 设计方法的选用

    六大原则 创建好了之后算法不常变的 xff0c 比如计算器的加减乘除逻辑 xff0c 就可以用简单工厂模式 要是像商场收银机对打折等促销的处理 xff0c 若用简单工厂模式也可以 xff0c 不过要在工厂内创建多个具体的打折方案 xff0c
  • XXX测试用例设计?XXX怎么测试?(行李箱、电梯、水杯、笔、椅子)

    首先要知道 xff0c 答案要从下面6个方向考虑 xff1a 功能测试 界面测试 易用性测试 兼容性测试 安全性测试 性能测试 其次 xff0c 在回答问题前要向面试官表明 xff1a 我不知道XXX的具体需求 xff0c 所以会以我认知的
  • 面试——测试基础理论

    测试先导性知识 测试是什么 xff1f 在规定的条件下对程序进行操作去发现错误 xff0c 然后对软件质量进行评估的一个过程 需要注意的是 xff0c 软件是由文档 数据以及程序组成的 xff0c 所以对软件测试应该包括 xff1a 软件形
  • 【ubuntu16.04 LTS】 ping www.baidu.com不通

    想更新一个软件包 xff0c 发现ubuntu不能正常更新 xff0c 结果ping www baidu com不通 xff0c 但是ping ip 可能 xff0c 所以认为是DNS没有配置 解决方法 xff1a 1 xff0c 既然能p
  • 小鼠试毒问题(二进制)

    1000桶酒 xff0c 其中1桶有毒 而一旦吃了 xff0c 毒性会在1周后发作 问最少需要多少只老鼠可在一周内找出毒酒 如题 分析思路 xff1a 要用尽可能少的老鼠完成相对大的任务量 xff0c 要想到把问题进行对数分解 从而不难想到