我正在尝试解决这个问题:https ://www.interviewstreet.com/challenges/dashboard/#problem/4f9a33ec1b8ea
假设 A 是 n 个数字 (A1, A2, A3, ... , An) 的列表,B (B1, B2, B3, ..., Bn) 是这些数字的排列。我们说 B 是 K 操作的当且仅当它的以下值:
M(B) = min( B1 Xor B2, B2 Xor B3, B3 Xor B4, ... , Bn-1 Xor Bn, Bn Xor B1 ) 不小于 2^K。给你 n 个 A1 到 An,你必须找到最大的 K 使得这些数字的排列 B 是 K 操纵的。
输入:
在输入的第一行有一个整数 N。在输入的第二行有 N 个整数 A1 到 An N 不超过 100。Ai 是非负数,适合 32 位整数。
输出:
在输出中打印一个整数作为测试的答案。如果没有这样的 K 打印 -1 到输出。
样本输入
3 13 3 10
样本输出
2
样本输入
4 1 2 3 4
样本输出
1
解释
第一个样本测试 这里列表 A 是 {13, 3, 10}。A 的一种可能排列是,B = (10, 3, 13)。
对于 B,min( B1 xor B2, B2 xor B3, B3 xor B1 ) = min( 10 xor 3, 3 xor 13, 13 xor 10 ) = min( 9, 14, 7 ) = 7。
所以存在 A 的置换 B 使得 M(B) 不小于 4 即 2^2。然而,不存在 A 的任何排列 B 使得 M(B) 不小于 8 即 2^3。所以 K 的最大可能值为 2。
==================================================== =================================
这是我迄今为止所做的尝试。
尝试 1:贪心算法
- 将输入放入数组 A[1..n]
- 计算值 M(A)。这给出了最小异或值的位置 (i, (i + 1) % n)
- 检查将 A[i] 或 A[(i + 1) % n] 与数组的任何其他元素交换是否会增加 M(A) 的值。如果存在这样的元素,请进行交换。
- 重复步骤 2 和 3,直到 M(A) 值无法提高。
这肯定给出了一个局部最大值,但我不确定这是否给出了全局最大值。
尝试 2:在给定邻居约束的情况下检查置换是否存在
- 给定输入 A[1..n],对于 i = 1..n 和 j = (i+1)..n 计算 x_ij = A[i] XOR A[j]
- 计算最大值(x_ij)。请注意,对于某些 p,2^p <= max(x_ij) < 2^(p+1)。
- 收集所有 x_ij 使得 x_ij >= 2^p。请注意,此集合可以视为具有节点 {1, 2, .. n} 的图 G,如果 x_ij >= 2^p,则节点 i 和 j 在它们之间具有无向边。
- 检查图 G 是否有一个循环恰好访问每个节点一次。如果存在这样的循环,则 k = p。否则,令 p = p - 1,转到步骤 3。
这给出了正确的答案,但请注意,在第 4 步中,我们实质上是在检查一个图是否具有哈密顿循环,这是一个非常困难的问题。
有什么提示或建议吗?