Question:
热还是冷。你的目标是猜出1到N之间的一个秘密整数。
每次猜完一个整数后,你会知道你的猜测和这个秘密整数是否相等(如果是则游戏结束)。
如果不相等,你会知道你的猜测相比上一次猜测距离该秘密整数是比较热(近)还是比较冷(远离)。
Answer:
假设你知道秘密数在区间[a,b]上,且最后一次猜的数值为c。
你希望将区间一分为二,这样就可以知道该数是在[a,m]上还是在[m,b]上,其中m=(a+b)/2。
处理这个问题的技巧在于如何选择下一个要猜的数d。我们可以选择满足(c+d)/2 = (a+b)/2的d值。
为了不降低一般性,我们假设d比c大一些,这样:
若d比c热,秘密数就一定比(c+d)/2 = (a+b)/2 =m 要大,这样的话,秘密数就应该在[m,b]上。
若d比c冷,秘密数就一定比(c+d)/2=(a+b)/2 = m 要小,这样的话,秘密数就应该在[a,m]上。
否则 ,你已经找到了这个数
为了用到通常都会用到的中间位置的数m(想想二分查找),我们需要可以猜测的范围扩展到[-N,2N],因为不能保证c和d也是在[a,b]中间的。
初始时你可以从1,或者N开始猜测。
鉴于每次问题规模都会二分,时间复杂度为O(log(N))+O(1)。
Example:
示例1:
Guess Result Interval of the secret number
1 *** [1 , N ] // d = a + b - c
N cooler [1 , N/2 ] // N = 1 + N - 1
-N/2 cooler [N/4 , N/2 ] //-N/2 = 1 + N/2 - N
5N/4 hotter [3N/8, N/2 ] // 5N/4 = N/4 + N/2 + N/2
-3N/8 hotter [3N/8, 7N/16] //-3N/8 = 3N/8 + N/2 - 5N/4
. . . .
. . . .
. . . .
示例2:
Reference:
http://stackoverflow.com/questions/25558951/hot-and-cold-binary-search-game
https://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi?board=riddles_cs;action=display;num=1316188034
Copyright
Author: vmxplus
From: http://blog.csdn.net/vmxplus
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.