小言_互联网的博客

1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?

570人阅读  评论(0)

对于此问题,一个思路是通过对问题分解:

首先一个猪在一个小时内的状态可以分为5种:

一.0分钟喝水,15分钟死去

二.15分钟活着再喝水,30分钟死去

三.30分钟活着再喝水,45分钟死去

四.45分钟活着再喝水,60分钟死去

五.60分钟还活着

对比于一个猪有5个状态,可以考虑状态机以及计算机二进制思想:

一个猪一个小时可以表示5个不同桶,两头猪可以表示5*5=25个不同的桶……

根据题目总共1000个桶:至少需要多少头猪的话?

根据几个猪可以表达1000这个完整的数的状态:

=3125>1000

所以至少5个猪可以实现这1000头猪的数值范围覆盖。

这是在思想的实现,是5头猪可以实现,但对于实际操作的理解该如何操作那?

把5头猪按照5进制的数据的排列5号,4号,3号,2号,1号(每个位可以有0,1,2,3,4状态值,只是对于值为0 的位,任何权值相乘都为0,对于实际的计算出那头猪没意义),把1000个桶按照5进制编号如01111=1+5+25+125=156,04444=624等

根据此编码可以实现1-1000个桶的编码,然后在前15分钟内,

可以分别让1号猪喝1号位为1的桶:00001,00011,00021,00031,00041,00101,00111……等等,

总共1+4+4*5+4*(1+4+4*5)+1*125=250个(在第五位只能取0和1,大于1之后已经超过1000的总桶数)

二号猪喝2号位为1的桶:00010,00011,00012,00013,00014等,类比一号猪,总共是250个个桶

三号猪喝00100,00101,00102,00103,00104等,类比以上,可得共250个桶

四号猪喝01000,01014,00024,00034,00044等,总共250个桶

五号猪只喝10000,10001,10002,10003,10004等,总共的桶数为625桶

总共喝过1625桶水,因为这里面猪喝的桶数是有重叠的,如1号和2号猪都喝过00011即3号桶,但其实前15分钟并不是所有的桶都喝过,如)02222,03333等,前15分钟可以根据5头猪的情况具体情况死还是活来判断,若只有2号猪死亡,因为只有一桶水有毒多以说明有毒的水在2号位编号为1的水桶中,因此2号猪未喝过的水可以排除(若M桶水中有N桶水都有毒,该问题就变的不一样,该问题提供大家思考解答),其他4个还活着的猪会继续喝水试毒,30分钟时,情况和15分钟时情况类似,一直到1个小时之后的情况。

第15分钟到30分钟,分别重复前15分钟的过程,活着的猪分别喝对应的位置号码为2的桶水,情况类似,但5号猪,其实已经不用再喝水了,因为第5位为2已经超过1000个桶了,所以5号猪目前休息,其实在实际动态分析的过程中,可以考虑如果5号位没有死亡的话,把他进行对剩下的未被喝过的水重新分配给这剩下的猪进行检验。不过对于该问题,静态分析就按照前面对应位喝对应位值为1的水。

重复此过程直到60分钟,根据5头猪在5个不同时间段的状态值(死,活)可以最终计算出有毒的水桶。如下图:

               猪的位号
猪的状态
1 2 3 4 5
         
1     1  
  1      
    1    
        1 

该表中的,猪的位号代表编号1,2 3,4,5的5头猪,状态的一二三四五代表其最终的状态表,每个猪的状态只能是一二三四五中的一个且必须有一个,如表中 的猪状态用1表示,如果为该结果可以分析:1号猪检测出尾码为2的水中有一个有毒,2号猪检测第二位3号有一个有毒,依次可得有毒的水为:02432,5进制转换为十进制:2+3*5+4*25+2*125+0*625=367号,即367号桶是毒水。

同时可以参考信息熵的思路:1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪? - 知乎
https://www.zhihu.com/question/60227816/answer/1274071217

 

 


 

 

 


转载:https://blog.csdn.net/soga235/article/details/106690599
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场