用十只耗子试出1000瓶中的一瓶毒酒

来源:互联网 发布:资源管理器 知乎 编辑:程序博客网 时间:2024/05/17 03:53

1000瓶酒,有1瓶是下了毒的,还有10只小耗子,让它们喝。中招的会在2小时前后死去(大约是两个小时,但决不会超过3小时),给你3小时,排除尽可能多的无毒酒,尽可能的缩小毒酒存在的范围。最厉害的办法是可以准确的找到那一瓶毒酒。应该怎么办呢?
当然,给耗子灌酒的时间可以忽略不计,每个耗子随便喝几瓶都成,酒也是喝不完的。由于体质不同,先喝到毒酒的耗子不一定先死。

第一个办法,每个耗子都喝一些酒,而且它们都还要喝一些别的耗子喝过的酒,如果只有一只耗子死掉了,那么毒酒就在只有它自己喝过那些酒里,如果死耗子超过一只,毒酒就在它们都喝过的那些酒里。这个办法精度比较低,范围在几十瓶内,仅好过每只耗子平均的分100瓶。

第二个办法,把1000瓶酒排成10行×100列的方阵,先把10只耗子摆在行上,一只耗子负责喝一行,就是100瓶。再把10只耗子摆在列上,一只耗子负责喝10列。这样,如果死了一只耗子,那么毒酒在10瓶之内,如果死了两只耗子,毒酒在二十瓶以内。你看,这个办法一下就提高的准确度。

第三个办法,把1000瓶酒排成10行×10列×10层的方块,先让10只耗子沿着行的方向喝,每只耗子喝100瓶,再让10只耗子沿着列的方向喝,每只耗子喝100瓶,最后让10只耗子沿着层的方向喝,每只耗子喝还是喝100瓶。都喝完了以后,如果只死了一只耗子,那么它三次都喝到的那瓶就是毒酒了。如果死了两只或者三只耗子,那么就可以精确到它们都喝过的那六瓶里面,为什么是六瓶就不说啦,一句两句也说不清楚,还要排列组合列方程式呢!你看,我们又进了一步,但是千万不要以为每只耗子喝的酒越多就会越精确!

最猛的办法出场了,先给每瓶酒编号,每瓶都编不同的号,可不是从1编到1000,那样做和不编号效果是一样的,这样做:
第1瓶 00000 00001
第2瓶 00000 00010
第3瓶 00000 00011
第4瓶 00000 00100
第5瓶 00000 00101
...
...
...
...
第1000瓶 11111 01000
(...
第1023瓶 11111 11111
也就是说这种办法的精度最高可达到2的10次方=1024)

再让耗子排队站好,abcde fghij
耗子的顺序不能变,它们和酒的编号中的每一位是对应的,这个很重要!来,第一瓶酒(编号00000 00001),只让是1的那位上的耗子喝,就是j耗子,其他位上是0的对应的耗子不用喝。然后第二瓶,第三瓶都是这样,只有对上1的那只耗子要喝。最后1000瓶都喝完了,耗子们有死有活,我们让死耗子=1,活耗子=0,于是,耗子们abcde fghij 就变成了一串0和1,假如这串数字是10001 00001,那么编号是这个数字的酒(用2进制转10进制就是第545瓶)就是毒酒啦!
原文链接:http://blog.sina.com.cn/s/blog_4d1f40c00100jigp.html