解密密钥

时间:2011-12-07 23:55:15

标签: algorithm

Alice发明了一个键(s 1 ,s 2 ,s 3 ,...,s k )。 Bob猜测(g 1 ,g 2 ,g 3 ,...,g k )。每个s i = g i ,他获得一分。 每个s1是整数,其范围为0 <= s i <= 11。 给出了他们的分数的猜测b i
(g 1 ,g 2 ,g 3 ,...,g k )b 1
(g 1 ,g 2 ,g 3 ,...,g k )b 2



(g 1 ,g 2 ,g 3 ,...,g k )b q

您能否说明是否有钥匙?给定0 <= si <= 11,1 <= k <= 11,1 <= q <= 8。 例如
2 2 1 1 2
1 1 2 2 1

对于猜测2 2 1 1,得分为2
对于猜测1 1 2 2,得分为1
因为有一把钥匙可以让我们说2 1 1 3给出了想要的分数。那么答案是肯定的

另一个例子
1 2 3 4 4
4 3 2 1 1

对于猜测1 2 3 4,得分为4
对于猜测4 3 2 1,得分为1

这没有给出所需分数的键,因此答案是否

我尝试了蛮力方法生成n ^ k这样的键,其中n是s i 的范围。但是它给出了超出时间限制的错误。
这是一个采访难题。我看过这个问题的变种但是无法解决它们。你能告诉我这些问题应该怎么读。

1 个答案:

答案 0 :(得分:0)

我不知道这个问题的最佳解决方案,但是如果你对可能的解决方案空间进行递归搜索,修剪分支,这可能不会导致解决方案,那么它将比尝试所有解决方案快得多(n ^ k)钥匙。

举个例子:

1 2 3 4 4 - &gt; 4
4 3 2 1 1 - &gt; 1

可能重要的g1的3个可能值是:1,4和“既不是1也不是4”。选择其中一个,然后递归查看g2的可能值。选择一个,并递归查看g3等的可能值。

在搜索时,记录从b1到bq的每个猜测的累积分数。无论何时为数字选择一个值,都要增加该位置中具有相同数字的所有猜测的累积分数。将这些累积分数保留在堆栈中(这样您就可以备份)。

当您达到无法解决的问题时,请备份并继续搜索其他路径。如果你一直回到g1并且没有剩下的路径可供搜索,那么答案是否定的。如果找到解决方案,那么答案是肯定的。

何时停止搜索路径并进行备份:

  • 如果其中一个猜测的累积分数超过给定分数
  • 如果其中一个猜测的累计分数低于给定分数减去搜索树中剩余的等级数(在您触底之前)

这种方法可能仍然很慢,特别是如果“k”很大。但同样,它将比生成(n ^ k)键快得多。