题意:
给定n个数,让你找出一个集合,使得集合中任意两个数的异或值<这两个数的最小值
解析:
要想使得两个数的异或值<这两个数的最小值 就得使这两个数的二进制位数相同才行。
如果不同有可能会出现>的情况
所以我们只要统计每个数的二进制位数。然后我们找出相同位数最多的,就是最大的集合长度
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int t,n,x;
int a[N];
bool cmp(int c,int d)
{
return c>d;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=1000;i++) a[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
int sum=0;
while(x!=0)
{
x>>=1;
sum++;
}
a[sum]++;
}
sort(a,a+100,cmp);
cout<<a[0]<<endl;
}
}