Algs4-1.4.34热还是冷-猜出秘密数(Hot or Cold guess a secret integer)

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:
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

Author: vmxplus
From: http://blog.csdn.net/vmxplus
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值