#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, l;
cin >> n >> l;
int cnt[l] = {0};
for (int i = 0, x; i < n; i ++)
{
cin >> x;
for (int j = 0; j < l; j ++)
cnt[j] += x >> j & 1; // !!!
}
int y = 0;
for (int i = 0; i < l; i ++)
if (cnt[i] * 2 > n)
y += 1 << i; // !!!
cout << y << endl;
}
return 0;
}
本题旨在 在所有已给数字的二进制中,找一个二进制,使得与他们所有的01对应的差异最小。那么我们只需枚举每个二进制并且对同位上的1的个数进行记录,当 1的个数大于等于n/2时,差异最小,此时在需要求的二进制的对应位置上来一个1即可,反之来一个0.
注意代码中关于二十进制之间的快速转化,建议记住。