版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/82917247
Description
托米完成了 的上一个任务,十分高兴,可是考验还没有结束
说话间 给了托米 个自然数 , 托米可以选出一些带回家,但是他选出的数需要满足一些条件
设托米选出来了$k b_1,b_2… b_k$, 设这个数列 的给值为 中所有数按位与的结果,如果你能找到一个整除 $b 2v (v\ge 0)$, 则设定 为这个数列的给价,如果不存在这样的 ,则给价值为$ -1$, 希望托米在最大化给价的情况下,最大化$ k$
Input
第一行输入一个整数$ n$, 第二行输入
Output
第一行输出最大的整数 , 第二行输出 个整数 , 按原数列的相对顺序输出 (如果行末有额外空格可能会格式错误)
Sample Input
5
1 2 3 4 5
Sample Output
2
4 5
Solution
从大到小枚举 ,将第 位都为 的数字取出,若这些数字逻辑与后在第 位后都是 则说明 合法,此时选取的数字显然最多
Code
#include<cstdio>
using namespace std;
#define maxn 100005
int n,a[maxn],ans[maxn],res;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int v=30;v>=0;v--)
{
int temp=(1<<v)-1;
res=0;
for(int i=1;i<=n;i++)
if((a[i]>>v)&1)temp=(temp&a[i]),ans[res++]=i;
if(temp==0)
{
printf("%d\n",res);
for(int i=0;i<res;i++)printf("%d%c",a[ans[i]],i==res-1?'\n':' ');
break;
}
}
return 0;
}