毒酒问题----算法设计与编程题------有1000桶酒,其中有一桶酒有毒.......

算法设计与编程题:

有1000桶酒,其中有一桶酒有毒,一只老鼠喝了毒酒后,一周后会毒性发作,若需要在一周之内找到这桶毒酒,请问至少需要几只老鼠,为什么?

说明:这道题用度娘一下,就能找到答案了。我再次在这里写成出来,一是,想分享一下我的解题思路;二是,当作学习笔记。

分析:

1、看到这题的直觉是:这题是一道查找题(找出有毒的酒),像在有序的数组里查找,二分查找,查找次数为ceil(log2N),所以这道题,猜测答案为10。

2、既然有这样的猜测,接下来就是验证。首先,我们可以从小规模的问题分析,再推广到大规模问题。因此,我们不妨,假设为8瓶酒(从1000-->8)。我们来回想一下,二分查找,[1,2,3,4,5,6,7,8]中查找:

毒酒问题----算法设计与编程题------有1000桶酒,其中有一桶酒有毒......._第1张图片

用第一只老鼠喝1,2,3,4号酒,一周后,老鼠死,则1,2,3,4号酒有毒,否则6,7,8,9号酒有毒。……,经过三周后,用三只老鼠,则能找出毒酒。想到这步简单,但是不合题意一周。

在此时,怀疑过是否能用二分查找,找出毒酒。但直觉还是相信能。继续思考,看到三只老鼠,有8种状态,(死, 死, 死), (死, 死, 生) ,…, (生, 生, 生),能否一种状态对应于某瓶酒有毒,刚好8种状态,对应8瓶酒。

1号酒有毒,用状态(死,死,死)表示,用数字表示为(0, 0, 0)

2号酒有毒,用状态(死,死,生)表示,用数字表示为(0, 0, 1)

…此时再看二分查找图树图,三层从上到下各层的路径标号,即为老鼠的状态,如4号,4<4.5选择左,此时标号0;4>2.5选择右,此时标号1;4>3.5选择右,此时标号1,,,状态为(0, 1, 1)、 (死,生,生)

 

在上图中用0表示,老鼠死;用1表示,老鼠死;

此时,第一只老鼠死,则1,2,3,4号酒有毒,则让第一只老鼠喝1,2,3,4号酒。否则5,6,7,8号酒有毒。

同时,第二只老鼠死,则1,2,5,6号酒有毒,则让第一只老鼠喝1,2,5,6号酒。否则3,4,7,8号酒有毒。

第三只老鼠死,则1,3,5,7号酒有毒,则让第一只老鼠喝1,3,5,7号酒。否则2,4,6,8号酒有毒。

规模推广从8-->1000,此时分析一样,答案为10。


在得到解后,再思考,就一个编码题,怎么安排老鼠喝酒,其实就是用0,1编码问题。


总结:大胆猜测,小心求证。从小规模问题开始分析,得到一般性解法,再推广。

 

你可能感兴趣的:(算法设计与编程题)