2009年4月10日星期五

强大的二进制数

今天实验室轮到我来发“每日一招”,(ps:解释下,这是我们项目组的一个内部活动,用来让大家在工作中将自己各方面好的经验和方法共享,同时也能活跃实验室的气氛),想了一会儿找不到什么好的东西,就将我当初在电视上看到的李开复在面试清华北大的两名计算机专业的学生时问的一个问题,如下:

有1000个苹果,现在给你十个箱子,将所有的苹果都装到箱子中,假设每个箱子都是可以装任意多的苹果的,现在要你提出一种装苹果的方案,使得要任意个苹果,都可以用其中的几个箱子搭配给出!

实验室的童鞋们果然都很聪明,很多人都在十分钟内就给出了正确的答案。同时有另外一个同学也由此引出了第二个问题:

一个奴隶主有1000坛酒,其中有1坛被人投了毒(很慢性的毒)。现在他要用他的奴隶来试毒,请问用怎么样的方法可以用尽量少的奴隶并且最少的时间把有毒的那坛找出来?

第一个问题的答案很简单,估计大部分人也能够很轻松的解决,就是让箱子装苹果的个数依次为1,2,4,8,......256, 489,大概原理就是1000个苹果用二进制表示的话是有十位,511用2进制表示是9个1,这样如果我们用前九个箱子装上2进制前九位每位数字代表的大小,我们就可以用其中的组合配出任意的一个<=511 的数了,再将最后的苹果数装入到最后的一个箱子中,如果需要的苹果数大于511而小于1000,就可以直接先将最后一个箱子的苹果给出,这样剩下来需要的苹果数就必然在511内了,这样就又可以由前面九个箱子组合配出。

第二个问题我刚开始始终不明白,只知道这题肯定与第一题极为相似,但是想了很久都不会(sigh!),最终还是请教他才得以解决。不得不承认二进制数是多么强大。题目是这样解决的:
首先呢,对1000坛酒编号,二进制号,十位即可,如“1010111010”,全部表示成十位,不足的补零。然后拿出十个奴隶,让第一个奴隶去喝把所有的编号右边第一位为0的酒喝一口,这样如果他死了说明毒酒编号的最后一位为0,否则为1;然后让第二个奴隶去将编号右边第二位为0的酒喝一口,这样就又可以确定毒酒右边第二位的数字,依次下去,就可以确定毒酒的编号了,看到没有,当我们这样分配后,可以在发现一个奴隶毒发身亡后就确定毒酒的编号了,效率够强大吧!
二进制数果真是强大!

0 评论: