一个面试问题的思考

问题:

有1000瓶超级名贵的葡萄酒,其中有1瓶有毒。这种毒药很厉害,哪怕被稀释了1000000倍还是可以毒死人的。但这个毒药一定时间后才会毒发,时长是1个月。为了不浪费这些葡萄酒,有100个壮士决定花5周的时间将毒酒找出,他们只希望最多有10个人牺牲,你需要如何安排才能实现。 -- TopLanguage

解法一:

1000瓶酒,人均10瓶那么可以这样把酒分组。
第一次:1-10,11-20,21-30...991-1000
第二次:2-11,12-21,22-31...992-1(就是1001循环到1)
第三次:3-12,13-22,23-32...993-2(就是1002循环到2)
...
第九次:9-18,19-28,29-38...999-8
第十次:10-19,20-29,30-39...1000-9

这样每次分组都有100组,对应每个壮士。十次分组,那么每瓶酒都有十个人喝,所以我们观察哪十个壮士毒发,那么就可以他们共同喝了那一瓶酒就是毒酒。
这个解法一定会有十个壮士毒发,代价大,但是满足要求。

但是这里没有用到时间。题目中35天时间没有用上

解法二:

同样也是分组,同样也是每人认领10瓶,但不一样的是不是一天喝完。
第一天:1-2,11-12,21-22... 意思第一个人喝1-2,第二个人喝11-12,以此类推
第二天:3-4,13-14,23-24...
第三天:5-6,15-16,25-26...
第四天:7-8,17-18,27-28...
第五天:9-10,19-20,29-30...
第五天:每个人都喝下一个人的偶数(或者奇数)瓶
那么根据壮士毒发的时间就能知道毒酒到底在哪,然后根据最后一天毒发的人确定到底是偶数有毒还是奇数有毒。注意加粗部分,第五天采用了两个操作。

第一种情况:
这里假设毒酒在前4天被喝到,那么在30-34天就知道哪两瓶酒有毒,在第35天看上一个区间的人是否毒发就能知道毒酒是在偶数瓶还是奇数瓶。
第二种情况:
这里假设毒酒在第5天被喝到,那么在35天才会有人毒发。这里假设第一个壮士 A 毒发了。这个壮士喝了自己的9,10 瓶酒,也喝了下一个人的偶数(奇数)瓶。
a. 如果下一个人也毒发那么毒酒就在下一个壮士的第偶数(奇数)瓶
b. 如果下一个人没有毒发那么毒酒就在 A 的第9瓶或者第10瓶里。这时观察 A 前面的壮士是否毒发就能确定,毒酒是第9瓶还是第10瓶。

这个解法利用了30-35天的时间差最多有两个壮士毒发,最少毒发一个,牺牲会小很多。

posted @ 2021-03-06 22:13  sinpo828  阅读(75)  评论(0编辑  收藏  举报