hight_bit

从n个数中,选k个数,使其二进制的与运算最大


// #include <bits/stdc++.h>
// using namespace std;

// int a[100010], ori[100010];
// bool keep[100010];
// int n, k;


// uint32_t highbit(uint32_t x) {
//     x = x | (x>>1);
//     x = x | (x>>2);
//     x = x | (x>>4);
//     x = x | (x>>8);
//     x = x | (x>>16);
//     return (x>>1) + 1;
// }


// vector<int> find(int max_h) {
//     vector<int> del;
//     for (int i=0; i<n; i++) {
//         if (keep[i]) {
//             uint32_t h = highbit(a[i]);
//             if (h != max_h) {
//                 del.push_back(i);
//             }
//         }
//     }
//     return del;
// }


// int main()
// {
    
//     cin >> n >> k;
//     for (int i=0; i<n; i++) {
//         cin >> a[i];
//         ori[i] = a[i];
//         keep[i] = true;
//     }

//     // 找所有数的最高位
//     int max_h = 0;
//     for (int i=0; i<n; i++) {
//         uint32_t h = highbit(a[i]);
//         if (h > max_h) {
//             max_h = h;
//         }
//     }

//     int cnt = n; 
//     while (max_h) {
//         vector<int> del = find(max_h); // 当前位为0的数的索引
        
//         if (cnt - del.size() == k) {
//             for (int k=0; k<del.size(); k++) {
//                 keep[del[k]] = false;
//             }
//             break;
//         }
//         else if (cnt - del.size() < k) { // 当前位为1的数不够k,所以这一位一定为0,因此用下一位筛选
//             for (int i=0; i<n; i++) { // 该位为1的数 我减掉该位,继续求
//                 if (keep[i] && a[i] > max_h) a[i] = a[i] - max_h;
//             }
//             max_h = max_h/2;
//         }
//         else if (cnt - del.size() > k) { // 当前位为1的数>k,所以这一位一定为1,用该位筛掉那些要删除的数
//             cnt = cnt - del.size(); 
            
//             for (int k=0; k<del.size(); k++) { // 删掉该位为0的数
//                 keep[del[k]] = false;
//             }
            
//             for (int i=0; i<n; i++) { // 该位为1的数 我减掉该位,继续求
//                 if (keep[i] && a[i] > max_h) a[i] = a[i] - max_h;
//             }
//             max_h = max_h/2; // 用下一位筛选
//         }
//     }

//     int ans=INT_MAX;
//     for (int i=0; i<n; i++) {

//         if (keep[i]) {
//             ans = ans & ori[i];
//         }
//     }
//     cout << ans << endl;
//     return 0;
// }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值