欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

托米的位运算

发布时间:2024/1/18 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 托米的位运算 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

链接:https://www.nowcoder.com/acm/contest/156/C
来源:牛客网
 

托米的位运算

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

托米完成了1317的上一个任务,十分高兴,可是考验还没有结束
说话间1317给了托米 n 个自然数 a1... an, 托米可以选出一些带回家,但是他选出的数需要满足一些条件
设托米选出来了k 个数 b1,b2... bk, 设这个数列 b 的给值为 b 中所有数按位与的结果,如果你能找到一个整除 b 的最大的 2v,(v≥ 0), 则设定 v 为这个数列的给价,如果不存在这样的 v,则给价值为 -1, 1317 希望托米在最大化给价的情况下,最大化 k

输入描述:

第一行输入一个整数 n, 第二行输入 a1...an

输出描述:

第一行输出最大的整数 k, 第二行输出 k 个整数 b1... bk, 按原数列的相对顺序输出 (如果行末有额外空格可能会格式错误)

示例1

输入

复制

5 1 2 3 4 5

输出

复制

2 4 5

备注:

n≤ 105, a1... an < 231

代码:

#include <iostream>using namespace std;int main() {int n,cnt;int a[100010];int b[100010];cin>>n;for(int i=0;i<n;++i)cin>>a[i];for(int i=30;i>=0;--i){cnt=0;int temp=(1ll<< 31) - 1;for(int j=0;j<n;++j){if(a[j]>>i&1) temp&=a[j],b[cnt++]=a[j];}if((temp&-temp)==(1<<i)) break;}cout<<cnt<<endl;for(int i=0;i<cnt-1;++i)cout<<b[i]<<" ";cout<<b[cnt-1]<<endl; }

 

总结

以上是生活随笔为你收集整理的托米的位运算的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。