题目描述
解题思路
让xor值更大,肯定最好能保证两个数每一个位(二进制位)都不一样,也就是1的位置要不一样
比如:1001 xor 0110 = 1111, 1001 xor 1000 = 0001
预处理出
2
2
2 ^
0
−
>
2
0 - > 2
0−>2 ^
30
30
30
对于每一个数,尽量选用大一些的二次方,且不可以重复使用一个二次方
Code
#include <iostream>
#include <cstdio>
using namespace std;
int n;
long long f[35], sum, ans, x;
int main(){
scanf ("%d", &n);
f[0] = 1;//2^0 = 1
for (int i = 1; i <= 30; i++)//预处理
f[i] = f[i - 1] * 2;
for (int i = 1; i <= n; i++)
{
scanf ("%lld", &x);
sum = 0;
for (int j = 30; j >= 0; j--)//尽量选用大一些的二次方
if (f[j] && sum + f[j] <= x)
{
sum += f[j];
f[j] = 0;//标记为使用过
}
ans += sum;
}
printf ("%lld", ans);
}