小白鼠问题(海明码)

小白鼠问题(海明码)

同学问了一道智力题:30瓶水,其中有一瓶毒药,小白鼠喝了毒药之后一天会死,求只有一天时间,用最少的小白鼠找出毒药?

很简单的我就想到了海明码:

数位 数值
C1 00001
C2 00010
C4 00100
C8 01000
C16 10000

\(C1=A1⊕A3⊕A5...⊕A29\)

\(C2=A2⊕A3⊕A5...⊕A30\)

\(C4=A4⊕A5⊕A5...⊕A30\)

\(C8=A8⊕A9⊕A10...⊕A30\)

\(C16=A16⊕A17⊕A518.⊕A30\)

我们将A看作水,将水从1编号到30。C作为混合水,也就是将对应编号的水混合成5瓶水,对应C16C8C4C2C1。每瓶水用一只小白鼠实验(残忍),哪只死亡,哪只对应编号为1。例如,C8,C4死亡,那么对应二进制数为0110,也就是十进制12,代表12号水有毒。

如果推广到n瓶水呢?当:

\[2^x-1>=n\]

时,可以满足需求。即:

\[x>=log_2 (n+1)\]

所需小白鼠数量为大于等于以2为底n+1的对数的最小整数。

但是这个是使用一切情况吗?当n=1时,x=1。但是实际上,一杯水不需要验证,他就是有毒的。所以我发现当:

\[n=2^x\]

时是一种特殊情况。例如,当n=32时,我可以把标号为32的水拿出,剩余31瓶可以按照如上方法求出答案,只是多出一种00000的情况,说明前31瓶水都无毒。那么拿出的32号水肯定有毒!

所以正确的公式应为:

\[2^x>=n\]

即:

\[x>=log_2 n\]

所需小白鼠数量为大于等于以2为底n的对数的最小整数。这是推广到n时的正解。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务