题目
有1000桶酒,其中1桶有毒,而一旦吃了,毒性会在一周后发作,现在我们用小白鼠做实验,要在一周之内找出那桶毒酒,问最少需要多少只老鼠。
解法
初次见这种题,可能很难想到是考察位运算。思路如下:
- 对1到1000桶酒进行编号,1000的二进制编码需要10位二进制。
- 因此只需要使用10只老鼠,进行编码,第一只为:00000 00001, 第二只为:00000 00010,第三只为:00000 00100 ... 第10只为10000 00000.
- 然后让每只老鼠只喝与其编码做与运算结果非0的酒,如果某桶毒酒的编码在某一位为1,那么监控该位的老鼠必喝这桶酒。
- 然后根据10只老鼠的死亡情况,对应到10位二级制中,即为最后毒酒所在的编号。例如如果第1,2,6,10只老鼠死亡,那么对应的毒酒的二进制编码为:10001 000011,换成十进制即为毒酒所在位置的编号。
这种做法的正确性简单分析:
这种解法的其实是一个求交集的过程,1只老鼠其实喝了多桶的酒,例如第一只老鼠的编号为00000 00001,那么它喝的毒酒的编号,应该为二进制编码最后一位为1的所有酒,同样的其他9只老鼠也是分别喝了对应位置的若干桶酒,即这样这10只只老鼠实际上覆盖了1000桶的所有情况。那么在根据老鼠的死亡情况,即查找每一只死亡老鼠喝了那些酒中的交集,即为那一桶毒酒的二进制编码位置。