腾讯2012 笔试题-----A、B两人玩猜字游戏

邮差的信 提交于 2020-03-01 22:42:00
这个是腾讯2012年暑期实习生招聘的一道笔试题,考试的时候也没仔细思考,没做出来。╮(╯_╰)╭。现在回过来想想,这题还是蛮有意思的,本人给出了一种解法,不能保证100%正确,希望大家看到了提出自己的见解。

A、B两人玩猜字游戏,游戏规则如下:
A选定一个 [1,100]之间的数字背对B写在纸上,然后让B开始猜;
如果B猜的偏小,A会提示B这次猜的偏小;
一旦B某次猜的偏大,A就不再提示,此次之后B猜的偏小A也不会再提示,只回答猜对与否。
请问:B至少要猜(           )次才能保证猜对?在这种策略下,B第一次猜测的数字是(           )。


首先阅读题目,一个很重要的信息点就是: 一旦B某次猜的偏大,A就不再提示,此次之后B猜的偏小A也不会再提示,只回答猜对与否 。如果没有这个条件,或者说改变这个条件,改为: 如果B猜的偏大,A会提示B这次猜的偏大 那么相信大家都会给出答案,那就是用二分法,只需要7次就可以保证猜对了。

但是现在的条件变了,如果B猜的偏大,那么不提示,所以我们得出结论就是:如果猜的偏大,只能一个一个往下猜。例如 A写的数是91,你猜了100,偏大了,那么你需要猜99,98,97一直到91。这样就保证对了。这里就不能猜95来节省次数了,因为猜了95 无论是偏大或者偏小,都不会有提示,所以95两边都是需要猜的。从100到91需要猜10次。

我从上面可以看出,当我们猜的数偏大了之后,需要一个合理的下届来限定往下猜的次数,从下面两个例子来说明每次猜的间隔也是非常重要。
例1:我们要猜的数还是91,我们第一次猜90(偏小有提示),第二次猜100(偏大无提示),于是从100一个一个往下猜,这里90就成为了下届,所以我们从100往下猜,最多需要猜10次就可以保证猜到了(10次中包括猜100这一次),这里间隔为10。
例2:我们要猜的数还是81,第一次猜80(偏小有提示),第二次我们猜100(间隔20),这时就需要从100一个一个往下猜20次才能猜到(20次中包括猜100这一次)。这里间隔为20。

我们要得到答案,其实就是需要确定这个间隔,和第一次猜的数字。
用n来表示间隔,需要猜的至少的次数 类似于此公式的最小值 n+100/n。很容易得到n为10的时候最小。后面解释这个公式的含义。我们先来看看我给出的答案的一个例子,理论的东西我也表达不清楚。

例3:我们要猜的数字是91,我们第一步猜10,以10为间隔猜。
第一步10(偏小有提示),第二步20(偏小有提示),第三步30(偏小有提示),第四步40(偏小有提示),……,第九步90(偏小有提示),第十步100( 偏大无提示),因此一个一个往下猜,第十一步99,第十二步98,第十三步97,……,第十九步91 命中。所以这里需要19步就猜中了。19步也是我们的答案 ,需要保证19次才能100%的猜到。找不到另外一个数字,需要19步以上的。看下例。

例4:我们要猜的数字是81,我们第一步猜10,以10为间隔猜。
第一步10(偏小有提示),第二步20(偏小有提示),第三步30(偏小有提示),第四步40(偏小有提示),……,第八步80(偏小有提示),第九步90( 偏大无提示),因此一个一个往下猜,第十步89,第十一步88,第十二步97,……,第十八步81 命中。只需18步小于例1的19步。

例5:我们要猜的数字是1,我们第一步猜10,以10为间隔猜。
第一步10(偏大无提示),因此一个一个往下猜,第二步9,第三步8,……,第十步1 命中。只需10步就可以还是小于19步。

题目要求我们要保证猜对,就是要100%猜中,所以应该是 要猜中1-100 所有数字所需次数的最大值,即19。这个是需要注意的。

 再来说说 上面提到的公式,100/n就表示以10为间隔最多需要猜的次数,也就是我们例3中,猜的这几个步骤:10,20,30,40,……100。而n就代表从100猜到91需要的步骤,也就是间隔。
因为n + 100/n  >=  20  其中100这里我们重复了,所以是19次。

在实验过程中,发现第一步猜的数字是不固定的,1-10中的任意一个均可。大家可以试试的。
例如:第一步猜1,我们要猜的数字是82,按照例3的方法,也是19次。

所以最终我给出的答案( 这种方法是错误的): B至少要猜( 19)次才能保证猜对?在这种策略下,B第一次猜测的数字是( 1到10任一均可)。

非常感谢 6楼的 @大傻师,给出了更完美的方案, 我这种方案的只考虑到了间隔固定的情况下,经过@大傻师提点确实当间隔不固定的情况下,还能减少猜需要的次数,下面是@大傻师给出的答案。

答案是14次,第一次猜的数字应该是9到14中任意一个数
假设第一个猜的数字是k1
如果第1次答案是偏小,那下一个就猜k2=k1+13,如果还是偏小,再就是k3=k2+12,依次类推

如果哪次猜到答案是偏大了,就从那次猜的数字往下一个个猜,最坏情况就是14次。

例:如果第一个是9,那依次就是9,22,34,45,55,64,72,79,85,90,94,97,99,100

这题目确实锻炼人的脑子,开阔人的思维,是个不错的题目。欢迎大家提出宝贵的意见 谢谢!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!