天平称球问题
笔试题目碰到了天平称球的问题,之前遇到没有细细的查阅资料,再次笔试的时候就吃亏了,这里记录下结论:
现有N个小球,其中有一个坏球不知比标准球轻还是重。我们令H={log3(2N)}。
1)要保证在N个球中找出坏球并知道其轻重,至少需要称H次。 假设N≠2,我们有 2)如果N<(3H-1)/2,那么称H次就足够了; 3)如果N=(3H-1)/2,那么称H次足以保证找到坏球,但不足以保证知道坏球比标准球轻还是重; 4)如果N=(3H-1)/2,而且还另有一个标准球,那么称H次足以保证找到坏球和知道,知道坏球比标准球轻还是重。 假设N=2,我们有 5)如果还另有一个标准球,称H={log3(2*2)}=2次足以保证找到坏球和知道坏球比标准球轻还是重。
5)看起来有点奇怪,不过这其实很显然。如果有超过两个球,我们知道坏球是“独一无二”的那一个,总找得出来;但是如果只有两个球,一个好球一个坏球,都是“独一无二”的,如果没有一个标准球的话,我们无论如何不可能知道哪个才是好的。
一般地,能由H次称量找出坏球并知道其轻重的最大小球数量为 (3H-1)/2-1 = (3H-3)/2; 能由H次称量找出坏球但不需要知道其轻重的最大小球数量为 (3H-1)/2; 有一标准球,能由H次称量找出坏球并知道其轻重的最大小球数量也为 (3H-1)/2。 为了比如说为了找出坏球并知道其轻重,则3次最多可以称12个,4次为39个,5次为120个,6次为363个等等;为了找出坏球却不需知道其轻重,则3次最多可以称13个,4次为40个,5次121个,6次364个等等——但是如果另有一个标准球,那么就可以用相同的次数来知道坏球的轻重。
过程构造算法:
编码: 知道了球数,就能算出需要称量几次; 以这个次数作为长度,使用0、1、2排列组合进行编码,如001021、212022等等,再去掉全0、全1和全2,可知一共有个编码; 如果在一个编码中,第一处相邻数字不同的情况是01、12或20,则我们称它为正序码,如1120021; 否则为逆序码,如2221012; 在长度为n的编码中,正序码和逆序码的数量相等,均为个。 赋值: 如果把一个正序码中的0换成1,1换成2,2换成0,则它仍然是正序码; 根据这个原理,我们把所有正序码按3个3个进行分组,如12001、20112、01220这3个就是一组; 把正序码一组一组地分配给小球,每球一个,直到分完; 然后把每个正序码的0换成2,2换成0,它就变成了一个逆序码,如12001变成10221; 这样,每个小球就有了两个编码,一个正序,一个逆序,而且所有球都不重复。 称重: 第一轮,我们把所有正序码第一位为0的小球放在天平左侧,为2的小球放在右侧,其它的放在旁边; 如果天平左倾,记为0;右倾,记为2;平衡,记为1; 然后是第二轮,把第二位为0的小球放在左侧,为2的放在右侧,同样记下称量结果; 每一轮都按这个顺序进行,一共要称n次,最终结果是个n位的编码; 如果编码等于某个小球的正序码,则这个小球比其它球重; 如果编码等于某个小球的逆序码,则这个小球比其它球轻。
转自于:称球问题——经典智力题推而广之三