某公司的笔试中有这么一道题,说是[1,100]中的数,甲任选一个记在心中,让乙来猜。规则是这样的:
1、 乙猜的数比甲选得小,甲提示说小了;
2、 乙猜的数比甲选得大,甲不作提示。并且从此之后,除了乙猜的数正好是甲选得数,其他情况甲都不再作任何提示。
要求计算乙最少猜几次,才能保证猜出甲选得数。
以上是题目,如果有人说用这半查找,麻烦再读一下题。
这种情况,折半法是不行的,因为折半的基础是要知道每次猜的数是大了还是小了,这样才能确定折半的方向,这道题目的规则2显然不能满足。根据2的要求,可以知道,乙猜数时,必须由小往大猜,才有可能使猜的次数最小。并且,如果乙猜了Ai过小,随后猜了Ai+1过大,那么他必须穷举集合(Ai,Ai+1)内的所有数,才能保证猜对,其中。甲选的数若在(Ai,Ai+1)内,则保证能猜对的最小次数是
Ai-1-Ai-1+i。
假设至少需要猜n次,这样第一个猜的数A1最大为n,再大的话,就不能保证n次猜出了;若A1比甲选的数小,考虑到用掉的一次机会,第二次要最大猜n+n-1=2n-1,以此类推,直到第n次。要保证猜An到的话,必须有100<=An=n+(n-1)+(n-2)+…+1=n(n-1)/2,解之得到最小的整数为:14。由此得到的序列为:14,27,39,50,60,69,77,84,90,95,99,100;
这就是这道题的解法和思路。若扩展到一般情况,[1,100]换成[x,y],x>y,不等式可写为:
也就是,
OK,that's all!