老鼠与毒酒

问题I:
有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。
这是老鼠与毒酒最经典问法。


分析:

此问题可以用二进制的思想来解答。

将1000桶酒编号为0,1,...,999。

10只老鼠分别负责二进制中的相应位,即

第1只老鼠,喝掉编号的二进制表示中右边第一位为1的桶内的酒,即1,3,5,7,。。。,999桶内的酒。

第2只老鼠,喝掉编号的二进制表示中右边第二位为1的桶内的酒,即2,3,6,....桶内的酒。

第3值老鼠,。。。

。。。

一周之后,哪只老鼠死了,就说明对应的二进制上的值为1。

假如,第2,5,7只老鼠死掉了,那么说明编号为0001010010,即编号为82的桶内为毒酒。


扩展一下,如果有N桶酒,只有1桶有毒,那么至少需要m只老鼠,这里m为满足2^m>=N的最小的数。


问题II:

@陈利人:有11瓶酒,只有1瓶有毒。喝酒之后,三天会死,只有三天时间。请问至少需要多少只老鼠,可以找出9瓶没有毒的酒。


分析:

按照问题I的分析,11瓶酒,需要4只老鼠可以确定出10瓶没有毒的酒(原因:2^4 > 11, 2^3  < 11)。

但是,这里只需找出9瓶没有毒的酒,不需要把10瓶都找出来。

其实,只用找出哪两瓶中肯定有毒,剩下的9瓶酒就肯定没毒。

所以,可以11瓶酒进行分组,每组两瓶酒,可分为6组:(1,2), (3,4), (5,6), (7,8), (9,10), (11)。

按照问题I的解法,对组进行编号:0,1,...,5。

那么只需要3只老鼠(2^3 > 6),就可以确定出那一组内有毒酒,那么剩下的9瓶(或者10瓶)没毒的酒就找出来了。


ps:如果是12瓶酒,要找出9瓶没毒的酒,就可以3瓶为1组,分为4组,那么就只需要2只老鼠就可以了。


问题III:

有100只一模一样的瓶子,编号1-100。其中99瓶是水,一瓶是看起来像水的毒药。只要老鼠喝下一小口毒药,一天后则死亡。现在,给你2天的时间,请你告诉我,你至少需要多少只老鼠,才能检验出哪个号码瓶子里是毒药?

此题,就成了三进制问题了。具体分析可参考博文:致被毒死的老鼠君

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.版本 2 .如果真 (ItemID = 3020193) item.Name = “[魂玉]过关斩将” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020185) item.Name = “[魂玉]七星夺窍” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020188) item.Name = “[魂玉]五情七灭阵” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020187) item.Name = “[魂玉]捅劲” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020183) item.Name = “[魂玉]乾坤日月斩” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020179) item.Name = “[魂玉]分水斩” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020181) item.Name = “[魂玉]铁马残红” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020180) item.Name = “[魂玉]夺魂·双刀” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020173) item.Name = “[魂玉]强袭·离火式” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020182) item.Name = “[魂玉]易武·万华” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020174) item.Name = “[魂玉]五毒酒” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020163) item.Name = “[魂玉]流星飞坠” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3005005) item.Name = “[装备]红甲” item.Color = #红色 返回 (item) .如果真结束 .如果真 (ItemID = 3010053) item.Name = “[道具]锻造锤” item.Color = Color_4 返回 (item)翻译成c++ if源码
最新发布
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值