Interview100-91 著名的毒酒问题

题目

有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桶的所有情况。那么在根据老鼠的死亡情况,即查找每一只死亡老鼠喝了那些酒中的交集,即为那一桶毒酒的二进制编码位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值