Java算法面试题(009) 毒酒问题

介绍

1000桶酒,其中1桶有毒。用小老鼠做实验,一旦吃了有毒的酒,一周后小老鼠毒性就会发作而亡。问如何在最短的时间内用最少的老鼠找到那桶有毒的酒?

思路一

将现有的酒分成两组,分别将两组酒混合后喂给两只老鼠,1周以后即能分出哪组里存在毒酒;依次类推的话。

2的10次方为1024,因此进行10次迭代操作,即可找到那桶毒酒。总计使用20只老鼠,10周时间找到毒酒桶。

这个估计大部分程序员都能想到的方案,但这个不是最佳的方案。

思路二

给现有的桶按1-1000的编号,最大编号为1000,其二进制表示11 1110 1000,共10位。我们使用10只老鼠,编号分别为:

第01只  00 0000 0001
第02只  00 0000 0010
第03只  00 0000 0100
第04只  00 0000 1000
第05只  00 0001 0000
第06只  00 0010 0000
第07只  00 0100 0000
第08只  00 1000 0000
第09只  01 0000 0000
第10只  10 0000 0000
然后根据桶编号给相应的老鼠喂酒,如编号为100的酒桶,其二进制表示为00 0110 0100,其中从左边数第3、6、7位为1,取这桶中的酒喂给编号为3、6、7的老鼠,依次类推,将所有酒桶取酒喂给相应的老鼠。一周以后,根据死亡老鼠的编号,可以找出的酒桶,举个例子:比如第1、2、3、4只老鼠死亡了,那么表示的二进制数为 00 0000 1111,转换成10进制为15,因此可以推断出编号为15的酒桶中的酒有毒。

这确实是一种比较精巧的解法,依据二进制的表示,快速找到有问题的酒桶。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
.版本 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值