“找毒水” 算法题解法与思考

基本

问题描述

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

解法

这个提解法网上已经很多了,细节性的就不过多描述了,这里我只简单提下。这个题解法可以算是二进制的一个巧用。猪有死和活两个状态,正好对应二进制的0和1。我们把1000只猪二进制编码。每头猪只喝当前bit为为1的水,如下表

Num.10987654321
10000000001
20000000010
30000000011
10001111101000

1号猪喝1这列值是1的水,也就是第一桶+第三桶+…
2号猪喝1这列值是1的水,也就是第二桶+第三桶+…
以此类推…

然后我们可以轻松的计算得出编码10进制的1000桶,需要2n >= 1000, 可得n是10. 所以至少需要10头猪。

思考

扩展

原题15分钟毒发,并且给的时间限制也是15分钟,也就是说猪只能喝一次水。如果把时间限制放宽到30分钟,也就是猪能喝两次水。这个题接法又是什么? 刚刚运用了2进制,我们想当然可以想到,猪喝两次水,那就用3进制解决。然后就可以了,稍加思考一下会发现一个问题,假设猪在第一轮就死掉,那他就没办法参加第二次了。似乎3进制有点问题。再思考一下,我们可以发现这不是问题。3进制每位有0,1,2三个取值,对应到猪,就是没死,死了一次,死了两次,问题变成了如何定义“死两次”,我们可以把猪死亡记为1,第二轮死了猪还是死的,死亡计数加1. 通过调整一下编码和喝水时机,我们就可以用3进制解决这个问题。取值为2的第一轮喝,取值为1第二轮喝。正好对应死两次和死一次。

既然可以三进制,那么四进制,五进制。十进制。同理都是可以的。

数学

我们上面提到的都是解法,那换个解法的数学原理是什么。从二进制,一直到10进制乃至n进制。
我们总结发现,这其实是一个信息论的问题,一头猪所能提供的信息是它在什么时间死,因此能提供的信息量是-mlog(1/(1+n))。n为实验轮数,m为猪的数量。log(1/1000) = mlog(1/(1+n). 给定n求m,或者也可以给定m求n。
我们上面提到了2进制 3进制,只是符合的一种编码方式,也许 还有其他编码方式,也可以解决这个问题。这个就留待大神了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值