"""
1000 个瓶子,其中一瓶是毒药其余为水,小白鼠饮用毒药后会在第二天死亡
最少需要多少只小白鼠才可以在第二天知道那瓶是毒药?
采用位图 + 位运算的方式进行状态判断,复杂度 O(log2 N )
"""
import random
bottles = {x: 0 for x in range(1000)}
poison = random.randint(0, 999)
bottles[poison] = 1
print("随机生产的一瓶毒药:{}".format(poison))
mice = [1 << x for x in range(10)]
result = []
for m in mice:
r = 0 # 0 活着, 1死了
choose = filter(lambda x: x & m, bottles.keys()) # 选择小白鼠去试毒的瓶子
for bottle in choose:
r |= bottles[bottle] # 试毒过程
if r: # 死了,换下一只接着试
break
result.append(r)
# 二进制转十进制
temp = '0b' + ''.join(str(i) for i in result[::-1])
print("计算出第{}瓶为毒药".format(int(temp, 2)))
小白鼠试毒模拟
最新推荐文章于 2023-07-18 21:13:30 发布