码迷,mamicode.com
首页 > 编程语言 > 详细

一道算法题

时间:2015-03-02 22:21:27      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

闲来无聊在网上找题目练练。


碰到一道笔试题:
有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴之后一小时会死。请问最少用__只小白鼠,在1小时内一定可以找到至少14瓶无毒的水?


1.一开始设想任意组合14瓶水,共有120种可能,如果每种可能都尝试了,那么肯定可以找到14瓶无毒的水了,不过明显效率太差,白白浪费了小白鼠。

2.后来发现其实任意组合15瓶水,那么其实只需要16只就可以找到哪瓶有毒了。然而题目只需要找14瓶无毒的水,这样是找出来15瓶,明显浪费了。

3.这会就想到将水两两组合,共有8对,那么8只就可以得到14瓶无毒的水了。这感觉不错诶。

4.从开始一直以来就有一个潜意识感觉就是,小白鼠只死了一只,貌似也没有得到最大使用啊;这会突然觉得或许应该组合小白鼠。

4.然后就想到8对,就是8种可能,只需要3只就可以组合出8种可能,那么怎么组合呢?

设想8对水从0-7标号,编号为000-111,3只小白鼠设为A、B、C。
A喝第一个编号为1的,B喝第二个编号为1的,C喝第三个编号为1的,
那么A喝了100,101,110,111
B喝了010,011,110,111
C喝了001,011,101,111

出现中毒的情况分为8中,也设为000-111,000即为都没有中毒,111即为都中毒。第一个二进制数表示A的中毒情况,第二个表示B的中毒情况,第三个表示C的中毒情况。

如果中毒情况是000,那么毒水就在编号000的那对水里,其它7对共14瓶水都是无毒的。

随便选一个110,即A与B都中毒了,C没有中毒,那么可以排除001,011,101,111,可选的为来自A的判断:100,110。来自B的判断:010,110,那么可以知道毒水在110。
即中毒情况与水的编号对应。

可以对照下图来理解:

技术分享

 

一道算法题

标签:

原文地址:http://www.cnblogs.com/coolshell/p/4309794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!