https://www.nowcoder.com/acm/contest/156/C
POINT:
首先明确,题目是让我们从n个数中挑出k个数,他们&上之后的lowbit最大。
在lowbit最大的前提下,k最大。
遍历答案v,即lowbit=2^v。for循环遍历数组,若在第v位存在1(二进制),我们则肯定取这个数。
因为最后k个数一起&后,如果存在答案,肯定是XXXXX100000这样的形式。1即是第v位。
那么,我们取越多的符合条件的数(第v位存在1),他后面的1(若存在)则更有机会变成0。因为1&1=1,别的都是0
若到最后lowbit都不等于2^v,说明不存在k个数,&上使得lowbit=2^v
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
#define LL long long
const LL maxn = 1e5+33;
LL a[maxn];
int main()
{
LL n;
scanf("%lld",&n);
for(LL i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
LL ans[maxn];
for(LL i=31;i>=0;i--){
LL to=1LL<<i;
LL now=(1LL<<(i+1))-1;
LL cnt=0;
for(LL j=1;j<=n;j++){
if(a[j]&(to)){
now=now&a[j];
ans[++cnt]=a[j];
}
}
if((now&-now)==to){
printf("%lld\n",cnt);
for(LL i=1;i<=cnt;i++)
printf("%lld%c",ans[i],i==cnt?'\n':' ');
break;
}
}
return 0;
}