2017-09-02 18 views

回答

3

我假设我们必须给定的数组分成两个子阵列道歉这样一个子数组的元素的XOR和其他子数组的元素之间的区别是最小。

int main() { 
int n,*a; 
cin>>n; 
a = new int[n]; 
for(int i=0;i<n;i++) { 
    cin>>a[i]; 
} 
int total_xor=0; 
for(int i=0;i<n;i++) { 
    total_xor ^=a[i]; 
} 
int min_diff = 1000000009,part_xor=0,split_index=0,i; 
for(i=0;i<n;i++) { 
    total_xor^=a[i]; 
    part_xor^=a[i]; 
    if((abs(total_xor-part_xor))<min_diff) { 
     min_diff=abs(total_xor-part_xor); 
     split_index = i; 
    } 
    //cout<<abs(total_xor-part_xor)<<"\n"; 
} 
cout<<"First subarray 1 to "<<split_index+1<<"\n"; 
cout<<"Second subarray "<<(split_index+2)<<" to "<<n<<"\n"; 
} 
1

如果子序列的意思是一个连续的子阵列,那么Sanjeevkumar的答案就足够了。然而,如果你的意思是你需要将数组拆分成两个数组,而且条件不是它们都是由连续的范围组成的,那么我想到的最简单的解决方案就是使用动态规划。

DP阵列需要有2个维度:

  1. i:你想目前的指数选择是否要添加到第一或第二序列。

  2. firstXOR:异或对于已经加入到第一序列的所有元素。

DP关系如下:

DP[i][firstXOR]=分钟(DP[i+1][firstXOR^a[i]]DP[i+1][firstXOR]

  1. DP[i+1][firstXOR^a[i]]表示将当前元件的选择到第一个子。

  2. DP[i+1][firstXOR]表示将当前元素添加到第二子序列的选择。

当到达基本状态(i == end of the array)你应该返回firstXORsecondXOR之间的差值(secondXOR是添加到第二子序列的元素的XOR)。

请注意,可以容易地获得secondXOR通过执行以下操作(您已经添加到所述第二子序列元件的XOR):

secondXOR = (的阵列中的所有元件XOR)^firstXOR

+0

我真的明白你可以给我一个伪代码或任何编程语言的代码 –

+0

我更新了我的答案。希望现在更清楚。 –

+0

这真的有助于:) –

相关问题