给定三个正数n、x和y。玩家 A 知道 x + y,玩家 B 知道 x * y。每个玩家轮流猜测 x 和 y (x, y <= n). Player will say "I don't know" if they cannot guess the answer or if they certainly know the answer, they guess it and end the game. Count the number of "I dont't know" during the game.
用什么算法来解决这类问题?
我尝试用谷歌搜索但无法得到答案。
编辑:
例如,n = 10,x = 3,y = 6。游戏发生如下:
答:我不知道。
B:我不知道。
答:我不知道。
B:我不知道。
A:是 3 和 6!
实际上,有一种情况他们无法猜出答案:n = 10,x = 3,y = 5,游戏如下:
答:我不知道
B:我不知道
答:我不知道
B:这个游戏会一直玩下去,就到此为止吧。
数一下游戏过程中“我不知道”的数量。
这没有明确的定义。 “我不知道”的数量可能相差很大。我在这里回答的问题如下:假设两个玩家都“最佳”发挥,只做出与他们对总和/乘积的知识相匹配的猜测,并且不重复对手已经做出的猜测 - 但不知道哪些猜测他们的对手做了什么,以及他们的对手有哪些知识 - 在游戏结束之前总共会有多少个错误的猜测?
爱丽丝知道 s = x + y。她需要猜测多少次(在最坏的情况下)才能猜出 x 和 y?她只需要尝试所有“分区”x' + y' = s,从 x' = 1, y = s - x' 开始,以 x' = s - 1, y' = 1 结束。这些是 x + y - 1 猜测她需要进行(例如,如果 s = x + y = 4,她需要猜测 (1) x' = 1, y' = 3; (2) x' = 2, y' = 2 ; (3) x' = 3, y' = 1).
鲍勃知道 p = x * y。 Bob 需要猜测所有分区 x' * y' = p。为此,他可以检查 p 的所有约数 x',并计算 y' = p / x'。最简单的算法是遍历从 1 到 p 的所有数字,检查它们是否整除 p;更有效的方法是迭代到 p 的平方根。然而,(素数)分解最终是一个难题。令 d 为 p = x * y 的约数数。
这样,Alice 和 Bob 都获得了与他们的知识相匹配的有效猜测 A 和 B 集。这给了我们三个集合:A - B(爱丽丝可能必须做出的猜测,但鲍勃不必做出),B - A(鲍勃可能必须做出的猜测,但爱丽丝不必做出),和 AB(都必须进行猜测)。
现在最坏的情况是,双方玩家都可以从必须做出的猜测开始;一旦他们用完这些,他们就会做出“常见”的猜测。
令 l = min(|A - B|, |B - A|), u = max(|A - B|, |B - A|), c = |AB|。 对于前 2l 次猜测,需要进行较少猜测的玩家(我们称他们为 L,另一位玩家为 U)每轮都会完成一次猜测,但 U 的猜测对他们来说没有用。 进行 2l 次猜测后,L 需要开始进行“常见”猜测。此阶段持续 2 分钟(c,u - l)猜测(L “提前完成”或 U 需要开始进行共同猜测)。 在这个阶段之后,双方玩家只能做出剩下的共同猜测。每一轮都会做出 L 剩余的猜测之一。
因此,至少需要 2(l + min(c, u - l)) + c - min(c, u - l) - 1 次错误的猜测(请注意,最后的“猜测”将是正确的,因此 - 1 ).