牛客网练习赛23C

链接地址https://www.nowcoder.com/acm/contest/156/C
思路很简单,只需要枚举最高位,且低位都为0即可,容易错的是忘记判断低位,我第一次写的时候就忘了。

#include<iostream>
#include<cstring> 
#include<algorithm>
#include<vector>

const int maxn =1e5+5 ; 
using namespace std ;
typedef long long ll ;
ll inp[maxn];

int main(){
    int n ; 
    scanf("%d",&n);
    for(int i = 0 ;i< n ; i++)
        scanf("%lld",&inp[i]);
    vector<ll> ans ; 
    for(int i = 30;i>= 0; i--){
        int m = 1<<i ; int mm = m-1; 
        for(int j = 0 ; j < n ; j++)
            if(inp[j]&m) {
                ans.push_back(inp[j]);
                mm= mm&inp[j];
            }

        if(mm==0){
            if(ans.size()>0){
            cout<<ans.size()<<endl;
            for(int j = 0 ;j< ans.size();j++){
                printf("%lld",ans[j]);
                if(j!=ans.size()-1)
                    printf(" ");
                else printf("\n");
                }
            }
            else printf("-1\n");
            break ; 
        }
        ans.clear();
    }
    return  0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值