东方花猪
级别: 网络英雄
精华主题: 0
发帖数量: 857 个
工控威望: 6586 点
下载积分: 13326 分
在线时间: 753(小时)
注册时间: 2009-12-17
最后登录: 2024-12-23
查看东方花猪的 主题 / 回贴
楼主  发表于: 2021-07-14 13:29
一道有意思的算法题,了解一下,对扩张思路有帮助。

问题描述:
有100个一模一样的瓶子,其中99瓶中装的是普通的水,一瓶是毒药,水和毒药只能通过老鼠来分辨,喝下毒药的老鼠会在一个星期后死亡(刚好一个星期)。现在你有一个星期时间,请问至少需要多少只老鼠才能确定出哪个瓶子装的是毒药?

我本来想的是用坐标的方式来确定哪一瓶是毒药:
1、摆成2x50,4x25,5x20,10x10的方阵
2、每行都放一只老鼠,然后让老鼠把这行水都喝一口
3、每列放一只老鼠,然后让老鼠把这列水都喝一口
4、一周后测试每一行和测试每一列的老鼠中都会有一只死亡,通过死亡的老鼠就可以判断毒药的坐标啦
5、需要的老鼠数量=方阵的长度+宽度
   所以10x10的方阵最合适,需要老鼠20只
6、后来又想了想,为什么不建一个三维的坐标系呢,经计算4x5x5的坐标系最合适,所需老鼠=4+5+5=14只

最后看了其他解题方式之后,了解到这是一个二级制问题,用七只老鼠即可解决
这个解体思路,非常巧妙。

我们知道2的10次放等于1024,那么通过把瓶子编成二进制,同时把老鼠变成二进制的位值就可以分辨到底哪瓶水是毒药

1.利用二进制来做,最少的老鼠数量就是计算2的多少次方大于等于瓶子数量,例如本题为7(2的7次方为128,大于100)。对100瓶进行二进制编码,这样可以排列出1xxxxxx,x1xxxxxx,...,xxxxxx1这样的七组序列。如第一瓶药水编码为0000001,第五瓶药水编码为0000101,第一百瓶药水的编码是1100100.

2.把老鼠分辨编成1-10号,分别对应二进制的第1位,第2位.....第10位

3.根据每瓶水的二进制代码给老鼠喝水,该位值为1就给该位值的老鼠喝,为0就不喝,比如,第一瓶药水编号为0000000001,就只给1号老鼠喝,第84瓶,编号是1010100 ,就给3号,5号,7号老鼠喝

4.1星期后,看哪些老鼠死了,然后死的老鼠位为1,没死的老鼠位为0,组成二进制数,该数对应的瓶子编号就是有毒的编号。
本帖最近评分记录:
  • 下载积分:+2(windstorm) 好贴好贴!
  • 下载积分:+5(bogegongkong) 感谢分享!
  • 拆二代
    csc1022
    级别: 探索解密
    精华主题: 0
    发帖数量: 42 个
    工控威望: 196 点
    下载积分: 993 分
    在线时间: 108(小时)
    注册时间: 2009-07-26
    最后登录: 2024-12-21
    查看csc1022的 主题 / 回贴
    1楼  发表于: 2021-07-15 11:13
    从生命角度考虑的话,用99只或许像中彩票一样一个不死,  
    [ 此帖被csc1022在2021-07-15 12:28重新编辑 ]