牛客练习赛23 . 托米的位运算

https://www.nowcoder.com/acm/contest/156/C

题意:一组数组,任意数进行与运算,找到最大能被的2^k整除的数,并将结果按原来顺序输出

思路:能是2^k的整除的一定只有最高位有1,那么就按位从高到低遍历

//
//  main.cpp
//  托米的赌球
//
//  Created by dhl on 2018/7/27.
//  Copyright © 2018年 dhl. All rights reserved.
//

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int n, a[maxn], ans[maxn], res;
int main(int argc, const char * argv[]) {
    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; //最高位-1
        res = 0;
        for (int i = 1; i <= n; i ++)
            if((a[i] >> v) & 1) temp = (temp & a[i]), ans[res ++] = i;
        //如果最高位有1
        if(temp == 0) {//如果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;
}

 

你可能感兴趣的:(题解)