欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?

程序员文章站 2022-05-14 21:56:12
...

1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?

题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?

第一次看这个问题完全没思路,应该有很巧妙的解法吧,后来还是百度一下,才明白怎么回事。

思路就是用二进制,2^10=1024,也就是10只小白鼠最多能验出1024瓶药水,哪个有毒。小白鼠编号,1-10。瓶子也编号,1-1000,然后把瓶子的编号转变为二进制数。如果第几位是1,就把这瓶水给第几个小白鼠喝。最后大概每个小白鼠喝500瓶药水的混合液。如果还不懂,下面列几个数字解释一下。

瓶子编号 二进制数 第几个小白鼠喝

1 0000000001 标志为 1

2 0000000010 标志为 2

3 0000000011 标志为  1,2

4 0000000100 标志为 3

5 0000000101 标志为 1,3

大概就是这意思,再反过来,假如1号和3号小白鼠死了,死的小白鼠用1表示,再写成2进制数:0000000101,转化为十进制数是5,从上面列出来的也可以看出1,3都喝了5号瓶的水,所以就是第五瓶水有毒。

解决方案
1)我们将1000瓶液体编号1~1000,然后将编号转化为10位二进制,如1号就是0000000001;
2)将十只小白鼠编号1~10;
3)将液体的二进制编号上为1的位数给对应的小白鼠喝,如液体编号为 1111100000,那就是15号小白鼠不喝这瓶液体,610号小白鼠喝这瓶液体;
4)一星期后观察小白鼠的死亡情况,如果15号小白鼠死亡,610号小白鼠存活,那么有毒的那瓶液体对应的二进制编码为 0000011111;
5)将第四步得到的二进制编码转化为十进制,这里是31号,因此我们可以推断出编号为31的液体是被污染的。

相关标签: java基础 java