面试题之猜数

某公司的笔试中有这么一道题,说是[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,不等式可写为:

x-1+n(n-1)/2<=y

也就是,

n(n-1)/2<=y-x+1 

OK,that's all!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值