大胖Ball 在Google面试,碰到这样一题:警察抓住一大帮人,有好人有坏人,好人过半。警察抽出一个,问其他人,是否坏人。好人说实话,坏人可能说实话,也可能不说。警察最少要问几次能完成甄别。经过长考,~N解法似乎不行,就争取在~NN上精益求精。 先用网友“真是好玩”的策略,抓出一个问众人(一个个问),如是好人,问题就解决了,说他坏人的在撒谎,就是坏人,只要把其余的人由他一一指认就行了。现在假定运气不好,每次抓出的都是坏人,但只要刚过半,就一定会有好人,所以粗略地说,最倒霉需要指认(3/8)NN+N/2 人次。 现在来讨论指认时坏人撒谎与否的得失。考虑第一轮,假定N=2M+1,M+1个好人,M个坏人。如果坏人都不撒谎,问了M+1个人后,就可得出结论。现在有一人撒谎,这一轮需要多问一次。但因为暴露了一个阶级敌人,可以少问一轮,所以撒谎是给警察帮忙。所以最坏的情况是坏人都不撒谎。这时每一轮询问次数如下。 (1)M+1 (2)M (i)M+2-i (M)2 剩下的都是好人(好人过半),就不用再问了。所以最恶劣的情况需要询问(M+3)M/2次。原来的粗略估计为(3/2)MM + M。改进还是很大的。 |