1000瓶药,1瓶有毒,找毒药

2024-02-29 15:59
文章标签 1000 毒药 有毒 瓶药

本文主要是介绍1000瓶药,1瓶有毒,找毒药,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【经典面试题】找毒药

问:现有1000瓶药,其中999瓶无毒,只有一瓶有毒。已知小白鼠喝了毒药1小时后会死,现给你10只小白鼠,和1个小时的时间,让你找出有毒的那瓶药。
备注:每一瓶药的量足够每只小白鼠同时服用。

当看到这么一道题的时候,我相信很多IT界的小伙伴都会第一瞬间想到二分法,左边500瓶,右边500瓶…当然,我也一样。
显然,这样的想法只能暴露出自己太年轻了。

其实这道题做法有很多,各路大神,奇思妙想。而我用了一种相对简单一点的办法。请看下面:

首先,我们应该肯定的是10只小白鼠是能够找出那瓶毒药的,为什么呢?
因为,每只小白鼠都有两种状态,死亡和活着。2的10次方就是1024,大于1000,所以是能的。(有点类似于算ip地址范围)

第一步:我们将10只小白鼠进行1-10的编号(小学生都会)。并将它与我们的二进制对应数字相对应。
在这里插入图片描述
第二步:我们将1000瓶药,从1-1000进行二进制的转换,例如:
第1瓶药:1----1
第2瓶药:2----01
第3瓶药:3----11
第4瓶药:4----001
以此类推。。。

这个时候,我们的1000瓶药都有一个二进制数与之对应
然后,我们让小白鼠的编号与药的二进制相对应,就像下面这样:
在这里插入图片描述
二进制的0、1,你可以把它理解为开关,在这里也一样,我们第4瓶药的二进制是001,所以第三只小白鼠就要喝这个药。便于大家理解,我再放一个实例,如下图所示:
在这里插入图片描述
第10瓶药,要喝它的小白鼠就是第2和第4只。就是这么个意思。

第三步:这10只小白鼠就把1000瓶药都品尝了个遍,到最后是不是就会死的死,活的活啊?那么我们就将死的小白鼠的编号记下来,例如:

死亡小白鼠的编号:2,5,6,7
在这里插入图片描述
我们就将这个编号对应的数字进行相加:2+16+32+64,这样就可以得出与之对应的那瓶药了。

那可能有的小伙伴会问了,为什么这样可以呢?
因为:我们将1000个数字转换成二进制,例如01011(26),此时这瓶药喝过的小白鼠有第2,4,5只。如果010111(58),这样喝过这瓶药的小白鼠有第2,4,5,6只。而此时死的小白鼠编号是2,4,5,6,那么敢肯定的是第26瓶药是没毒的,要不然人家第6只小白鼠没都没喝你,人家凭什么死啊。对吧?所以说就是这么个道理。

这篇关于1000瓶药,1瓶有毒,找毒药的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759319

相关文章

找出有毒的那一瓶药

找出有毒的那一瓶药 找出有毒的那一瓶药问题描述求解方法二进制编码方法详细示例 找出有毒的那一瓶药 问题描述 有47瓶药,其中只有一瓶有毒。从中毒到死亡时间为4天,问最少准备几只老鼠,在4天时间内找出有毒的药? 求解方法 要在4天内确定有毒药瓶,最少需要 6 只老鼠。以下是如何使用这 6 只老鼠来找出有毒药瓶的方法。 二进制编码方法 药瓶编号: 将47瓶药瓶编号从1到

【oracle sql错误】ORA-01795: 列表中的最大表达式数为 1000

select SOURCE_ID,FILTER_TEXT from TEXT_CENTER where SOURCE_ID in() in后面的括号里的数目超过1000条。 问题描述: SQL进行IN查询时,IN中的数据量不能超过1000条。 解决办法: 拆分:id in (1,2,3,4,5,,,,999) or id in(1000,1001,1002,1003,1004,,,,,,

汇总1000+国内外AI工具合集,工作效率提升10倍的秘诀!

工具合集在文章末尾有领取方式。记得点在看收藏,每天默默的学习,然后惊艳所有人。 很多AI,都是开发商在自己的领域,或是借助某个领域的资源进行算法的模型训练。就目前来讲,每款AI都具备它自身的功能特性,没有任何一款AI是全能的。这也就是说,想要让AI能全能代替人类思维工作,可能还需要更多的资源的链接。 对于用AI工具来做SEO优化,我总结了一套实战思路分享给副业项目微商圈公众号的朋友们。操作

1秒等于1000毫秒, 1毫秒等于1000微秒,1微秒等于1000纳秒

常用时间单位转换指南 在计算机科学、物理学以及其他领域中,我们经常需要处理不同量级的时间单位。了解这些单位之间的转换关系,可以帮助我们更准确地进行计算和分析。下面是一些常用的时间单位及其相互之间的转换。 时间单位概述 秒(Second, s):基本时间单位,定义为铯-133原子基态的两个超精细能级间跃迁对应辐射的9,192,631,770个周期的持续时间。毫秒(Millisecond, ms

HDU 1000 (水题)

题意:输入两个整数,求两个整数的和。   #include <cstdio>int main(){int a, b;while (scanf("%d%d", &a, &b) != EOF){printf("%d\n", a+b);}}

道阻且长,行则将至——记累计跑步1000公里

2017 年开始 Keep 软件记录跑步,确切的说是工作好多年之后正式开始跑步。 在跑步累计 100 公里的时候,当时定了个小目标:1000 公里。 https://mp.weixin.qq.com/s/_QqLHwiR659obLSQs2ZJnw 没想到,这一晃过去了 7 年,就在今天 2024年8月27日,累计跑量突破 1000 公里。 对于一些马拉松爱好者、经常跑步的跑友来说,这不值一

张宇36讲+1000题重点强化!保100冲120速刷攻略

如果你选择考研时全程跟随张宇的课程,基础阶段使用《张宇30讲》,强化阶段跟着《张宇36讲》,并且还要完成《张宇1000题》,那么你的任务量将非常大。尤其是今年,张宇老师的课程体系发生了重大调整: 张宇老师将往年只在强化阶段讲授的内容,提前整合到了《张宇30讲》基础课程中。而新版的《张宇36讲》是全新编写和录制的,内容非常丰富,书籍篇幅超过1200页。 《张宇1000题》的难度众所周知,其综合性

hiho 1000: A+B

时间限制: 1000ms 单点时限: 1000ms 内存限制: 256MB 描述 求两个整数A+B的和 输入 输入包含多组数据。 每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ A ≤ 100)。 输出 对于每组数据输出A+B的和。 样例输入 1 23 4 样例输出 37 代码(C语言): #include <stdio.h>in

工单发料,提示错:没有项目种类分配到科目 5001010100/1000

项目场景: 工单发料,MIGO过账时 问题描述 没有项目种类分配到科目 5001010100/1000 消息号 GLT2076 诊断 您系统中的在线凭证分离是活动的。此处,将每个 凭证分配给 科目交易变式并且将每个凭证行分配给 项目类别。 给每个业务交易变式确定此处可以或必须过帐的项目类别。 输入的凭证出现下列错误: 不能为科目表1000中的科目5001010100确定项目类别

解析Java中1000个常用类:PropertyResourceBundle类,你学会了吗?

在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。 小报童专栏精选Top100 推荐一个小报童专栏