【问题标题】:Guess the number, with lying allowed猜数字,允许说谎
【发布时间】:2011-04-15 17:57:54
【问题描述】:

我很确定你们都知道猜数字游戏(这里似乎已经有很多问题了),其中 Alice 想到了一个正整数,而 Bob 试图猜它。爱丽丝的回应是说“你知道了”、“低”、“高”。 Bob 可以做的常用策略是进行二分搜索,在 O(log n) 次猜测中猜测数字,其中 n 是 Alice 正在考虑的数字。

我一直想知道允许爱丽丝撒谎的变种。

假设现在允许 Alice 撒谎的次数是固定的(之前 Alice 和 Bob 都知道),但只有在回答“High”、“Low”时才允许撒谎(即,如果 Bob 猜对了数字,她不得不承认)。

Bob 还能猜出 O(log n) 次猜测中的数字吗?

如果允许 Bob 进行其他查询,例如“到目前为止,您撒了多少次谎?”,那会怎样? (爱丽丝必须如实回答)? O(log n) 查询仍然可能吗?

编辑:如果谎言的数量也被允许为 O(logn) 怎么办,并且额外的查询是:你撒谎的次数是否超过 x 次?爱丽丝被允许对他们撒谎......

为编辑道歉。

【问题讨论】:

  • 如果允许的谎言数量——比如 k——是固定的,与 n 无关,Bob 可以简单地问每个问题 2k+1 次,并且会得到 O(log(n))。
  • 只要在每个“标准”问题后面加上“你撒谎了多少次”——然后相应地切换答案。结果:提出的问题数量与 Alice 从不撒谎一样。
  • 我喜欢它。两个直接的想法(1)如何根据概率映射空间(2)尝试识别或错误答案的方案是什么样的?
  • 我不确定我可以提出多少问题。我进行了编辑,使谎言的数量变得不固定,并允许爱丽丝对谎言的数量撒谎……对不起,如果这是题外话(我可以看到一个接近的投票)。
  • @Jim:是的,这很有趣。有点像容错二进制搜索:-)

标签: algorithm


【解决方案1】:

运行通常的二分搜索算法。要么你得到答案,要么你得到一个不一致的结果(一个空的候选集)。如果你得到一个不一致的地方,爱丽丝一定至少撒了一次谎。重新启动二分查找。除非我遗漏了什么,否则在 O(k*log(n)) 步骤之后你会得到答案(加上她撒谎次数的下限)。您不需要先验地知道 k。

【讨论】:

  • 我想那是愚蠢的:一旦你完成了,你就知道她撒了多少次谎。至于优化,在最坏的(确定性)情况下,我认为你无法击败 k*log(n),因为 Alice 不必在任何给定运行的最后一个问题之前撒谎。如果你能用随机算法打败它,我不知道;这是个好问题。
  • 我认为关键是一旦你得到一个空集,就能够为下一轮选择一个更好的起点(而不是中间)。
  • 谢谢!我想保持简单,结果太简单了:-)
  • @Dante:我认为这仍然只是一个下限,因为在你达到不一致之前,Alice 可能会撒谎两次或更多次。
  • 对于任何未来的搜索者,我也在 math.stackexchange 上找到了这个页面以获得更深入的解决方案:math.stackexchange.com/questions/172372/…
【解决方案2】:

我认为它仍然是 O(log n),因为您指定 Alice 只能撒谎的次数是固定的。这意味着她最多可以将 Bob 的猜测数量乘以一个常数。

假设爱丽丝可以撒谎 5 次。 现在,无论爱丽丝什么时候撒谎,她最终都不得不自相矛盾。 Bob 会注意到这一点,并可以重新开始他的二分搜索。 Alice 也被限制在 O(log n) 次猜测范围内,否则 Bob 将正确猜测数字,而 Alice 将失去机会。

因此,在最坏的情况下,爱丽丝撒谎五次,每次/就在/鲍勃得到答案之前,她只是让鲍勃的二分搜索进行 6*(log n) 次猜测(五个谎言 + 一个正确答案) ,仍然是 O(log n)。

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多