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 的范围。但是它给出了超出时间限制的错误。
这是一个采访难题。我看过这个问题的变种但是无法解决它们。你能告诉我这些问题应该怎么读。
答案 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)键快得多。