1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?具体该如何实现方法讲解

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

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

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

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

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

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

五.60分钟还活着

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

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

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

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

5^{4}=625

5^{5}=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个不同时间段的状态值(死,活)可以最终计算出有毒的水桶。如下图:

               猪的位号
猪的状态
12345
     
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

update:看到有提问得问题里有问到为何不用位状态为0 的状态让猪去检测?

这个问题,打算言简意赅的解释下,如果是5进制,必然是0.1,2,3,4.前面介绍时主要使用的分别是检查位数数值为1,2,3,4的桶,实际上如果泛化的操作的话,可以任意选择0,1,2,3,4中任意4个数字为检测位来检测,如0,1,3,4或0,2,3,4等,这些都是可以的,这种想法对于计算机编程上变换也很简单,各种方法结果殊途同归。4个位数的值都检测过之后,必然可以得到另一个数值为的状态,如对应前面1234四个数值检测的126(01001)的检测结果对应的检测表格结果应该是:

               猪的位号
猪的状态
12345
 1  1  
   
    
   
  1 1 1 

因为2,3号猪最终还活着,证明该位数值为1,2,3,4都不在有毒的范围内,所以该位的只能是0的值的桶。

总结:该方法主要是首先如何全面覆盖1000个桶的范围,如何具体实现的方法有很多,该答案只是其中一种方法,该种方法还可以变换,最后只要无遗漏的检查出来,即实现目的。


 

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值