Cf Round 928 (Div.4)-D.Vlad and Division
重构题意:
给出n个数,把n个数分为若干组。分组方法为:
根据每个数的二进制编码,若任意两个数的二进制编码的所有位都不相同,则可以分到一组中。若任意两个数的二进制编码有一位相同,则不可以分到一组。问最少可以将这n个数分为几组?
思路:
二进制编码只有0和1,也就是说,任意两个数,要么二进制编码的位数全都不相等,要么二进制编码至少有一位相等。
根据题意,每个组内最多有两个数字,最少有一个数字。当我们记录了一个数分到了一个组后,要将这个数对异或(XOR)以等待一个二进制编码都不相同的数。(因为
的二进制编码都是1,一个数对1异或答案是0)
AC代码
#include<iostream>
#include<map>
typedef long long ll;
const int M = 2000005;
using namespace std;
void solve()
{
int n, x;
cin >> n;
map<ll, ll>m;
int ans = 0;
for (int i = 0; i < n; i++)
{
cin >> x;
if (m[x] == 0)
{
ans++;
m[((1 << 31) - 1) ^ x]++;
}
else
m[x]--;
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t;
cin >> t;
while (t--)
solve();
return 0;
}