我正在尝试解决此问题:https://www.interviewstreet.com/challenges/dashboard/#problem/4f9a33ec1b8ea
假设A是n个数字(A1,A2,A3,...,An)的列表,B(B1,B2,B3,...,Bn)是这些数字的排列。我们说B是K-Manipulative当且仅当它的值如下:
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:贪婪算法
这肯定会给出局部最大值,但我不确定这是否给出了全局最大值。
尝试2:在给定邻居约束的情况下检查是否存在排列
这给出了正确答案,但请注意,在第4步中,我们基本上检查图形是否具有哈密顿周期,这是一个非常难的问题。
任何提示或建议?
答案 0 :(得分:3)
有可能在不深入图论的情况下解决这个问题。
rich
建议的属性是解决此问题的关键:
跟进我的评论:B1 Xor B2< 2 ^ K当且仅当B1和B2时 同意除K低位之外的所有位
基于上述属性,我们只需找到每个A [i]的每个唯一高阶位最多n/2
次出现的最高k。
换句话说,在值A[i] >> k
组中,如果每个值最多重复n/2
次,则存在all the XOR values >= (2^k)
的k-操纵排列。
假设如果确实有超过n/2
次出现的任何唯一高阶位,则不可能获得置换B,所有循环XOR都不为零,即将存在至少有一个B[i] XOR B[(i+1) % N]
,所有高阶位都变为零,因此M(B) < 2^k
k = -1
for (bit = (MAX_BITS - 1) to 0) {
HashMap count
for (i = 0 to N - 1) {
higherOrderVal = A[i] >> bit
if (higherOrderVal exists in count) {
count[higherOrderVal] += 1
}
else {
count[higherOrderVal] = 1
}
}
isValid = true
for (element in count) {
if (element > N/2) {
isValid = false
break
}
}
if (isValid) {
k = bit
break
}
}
此解决方案的时间复杂度为O(M * N)
,其中M
是表示用于表示数字(32位,64位等)的最大位数的常量因子,以及N
是输入数组A的大小。
答案 1 :(得分:2)
跟进我的评论:B1 Xor B2&lt; 2 ^ K当且仅当B1和B2同意除K低位之外的所有位时,因此G具有完全多部分的非常特殊的结构,分区标签由除K低位之外的所有位组成。当且仅当没有多数分区时,完整的多部分图是哈密顿量。将此事实插入尝试2。
答案 2 :(得分:0)
首先插入所有对xor值以及连续的索引i和j-> pq.push(tuple(v [i] ^ v [j],i,j)) 现在弹出第一个maxm xor值,并设置索引i和j 现在再次弹出来自i或j的maxm xor值 此操作最多执行1到n 然后返回第n个弹出的xor值