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-Manipulative。
输入:
第一行输入整数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)。这给出了最小XOR值(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]
- 计算max(x_ij)。请注意,2 ^ p <= max(x_ij)<2 ^(p + 1)对于某些p。
- 收集所有x_ij,使得x_ij> = 2 ^ p。请注意,此集合可以视为具有节点{1,2,..n}的图G,并且节点i和j之间具有无向边,如果x_ij> = 2 ^ p,则存在。
- 检查图G是否具有访问每个节点恰好一次的循环。如果存在这样的循环,则k = p。否则,让p = p-1,转到步骤3。
这给出了正确的答案,但请注意,在步骤4中,我们实际上正在检查一个图是否具有哈密顿回路,这是一个非常困难的问题。
有任何提示或建议吗?
A = [2, 2, 4, 4, 2, 2, 4, 4]
,没有任何单次交换会改变M(A) = 0
,但是当然用B = [2, 4, 2, 4, 2, 4, 2, 4]
,你有M(B) = 6
且B
是2-manipulative的。如果您将条件更改为增加所涉及项目的XOR的最小值(或者实际上是XOR的最高设置位的最小值,假装0具有设置为“-1”的位),则它可能有效,但我不太确定。 - Daniel Fischer