你是被编码的羔羊吗

版权声明:博主保留一切权利,转载请注明出处。 https://blog.csdn.net/li_canhui/article/details/86314336

今天在孤独大脑微信公众号上看到一个有趣的算法类题目。

题目是这样的,一个国王有100桶酒,在一个漆黑的夜晚,有一个小偷,悄悄的往其中的一桶酒中投放了毒药,毒药是慢性药,大约半个小时会发作,令人死亡。国王得知了这个信息,决定找一些犯人,来尝试喝酒,从而确定究竟哪桶就被投毒了。问题是,如何使用最少的犯人在最短的时间里,确定被投毒的酒。

1,最容易想到的解决方案是,找99个烦人,每人喝每个桶中的一口,那么半个小时之后,就可以分辨出哪桶酒被投毒了。

然而,用99个人太多了,肯定有优化的空间。

2,第二种方案是,将100桶酒拜访成10 X 10的矩阵,找20个人,其中10个人,按行喝酒,把各行的10桶酒都喝一口。另外10个人,按列喝酒,把各列的10桶酒都喝一口,那么,半小时之后,会有2个人死亡,这两个人交叉的地方的那桶酒,被投毒了。

3,第三种方案是,扩展到三位空间,因为5 * 5 * 4 = 100,那么找5+5+4=14个人,不同人分别喝一面的桶中的酒,那么半小时后,会有3个人死亡,交叉的地方的那桶酒,是被投毒的。

那么,还能再改进吗?

采用二进制编码的方式可以继续优化。

因为2的7次方为128,大于100了,所以,我们找7个人。对这100桶酒分别编号1~100,用二进制表示各个编号。一桶酒的编号的二进制数值,可以在7位以内进行表示,哪位为1,那么该位置的人就要喝这桶酒。把100桶酒都这么处理,那么半小时候,会有若干个人死亡,那么,死亡的人为1,未死亡的人为0,他们组成的数字对应的编号,即为被投毒的酒。这个方案,只需要7个人。

那么既然编码这么好用,那为什么我们不用三进制,或者干脆用十进制呢?那样使用的人数会更少。

这是因为,每桶酒只有有毒和没毒2种状态,所以得用二进制。

猜你喜欢

转载自blog.csdn.net/li_canhui/article/details/86314336