算法设计与编程题:
有1000桶酒,其中有一桶酒有毒,一只老鼠喝了毒酒后,一周后会毒性发作,若需要在一周之内找到这桶毒酒,请问至少需要几只老鼠,为什么?
说明:这道题用度娘一下,就能找到答案了。我再次在这里写成出来,一是,想分享一下我的解题思路;二是,当作学习笔记。
分析:
1、看到这题的直觉是:这题是一道查找题(找出有毒的酒),像在有序的数组里查找,二分查找,查找次数为ceil(log2N),所以这道题,猜测答案为10。
2、既然有这样的猜测,接下来就是验证。首先,我们可以从小规模的问题分析,再推广到大规模问题。因此,我们不妨,假设为8瓶酒(从1000-->8)。我们来回想一下,二分查找,[1,2,3,4,5,6,7,8]中查找:
用第一只老鼠喝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编码问题。
总结:大胆猜测,小心求证。从小规模问题开始分析,得到一般性解法,再推广。