验毒与进制
验毒指的是在一堆正常的东西中找出异常的一个东西
例如:在 1000 个一样的瓶子中,找出一瓶毒药,喝了毒药的生物会死亡,现在有 10 个小白鼠,要如何才能检验出有毒的那一瓶。
小白鼠是有两个状态的,就可以转换成二进制,1 表示中毒,而 2 表示存活。这个时候如果将所有小白鼠排一起来,就构造成了一个 10 位的二进制数,这个数也代表这一种可能,所以小鼠状态的所有可能都在 中,我们发现总共有 1024 种可能性,那不是正好就可以对应 1024 个瓶子。 那我们可以直接将瓶子的需要也转换为二进制数,例如 8 号瓶子-> 0000001000,我们可以用 1 表示小鼠喝水,0 表示小鼠不喝水,那么这个二进制的含义就变成了,从右往左第四个小鼠喝这一瓶水,如果第 4 个小鼠死了就说明 8 号瓶子就是毒药,同理其他号数的瓶子也是这样。这样我们就可以通过个小鼠死亡或者不死亡构成的唯一二进制数来判断是哪个瓶子有毒了。
现在将问题升级一下,给小白鼠状态引入更多可能性
例如:1000 瓶水,其中一瓶有毒,喝毒水后会在 15 分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?
根据第一个例子,我们需要先找到小白鼠状态,分别是 15 分钟后毒死、30 分钟后毒死、45 分钟后毒死、60 分钟后毒死和存活,我们可以用 5 进制来表示。那猪的数量也就是 5 进制的数的长度,可以转换为 1000 用 5 进制表示需要多少位,那就很简单了 甚至多了两千多种可能。同样我们将 1000 以内的序号转换为二进制,然后 01234 分别表示在哪个时间段喝水和不喝水。然后用小鼠的状态确定的唯一 5 进制数就能判断哪一瓶有毒了。
总之就是先找小白鼠状态的可能性来判断进制,然后再看需要判断的水的数量用这个进制来转换需要多少位,那就是需要多少个小白鼠。