P9612 [CERC2019] Light Emitting Hindenburg 题解

题目传送门

题目大意

这个题目简化一下就是求 n 个数中取 k 个数按位与的最大值

思路

很容易想到贪心。

题中说道输入的数在二进制下最多 29 位,所以我们从 29 开始遍历二进制位,如果当前位有大于等于 k1,那么标记一下这些数,可以发现剩下的比当前位低的二进制位和无法大于当前位,所以必选当前位。最后再遍历时只需要考虑这些打过标记的数即可。

另外我们还需要知道如何取出整数 n 在二进制下的第 k 位:

(n>>k)&1

代码

#include<bits/stdc++.h>
#define MAX 200005
#define int long long
using namespace std;
int n,k,a[MAX],cnt,ans,tmp;
bool pd[MAX];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    memset(pd,1,sizeof(pd));
    for(int i=29;i>=0;i--){
        cnt=0;
        for(int j=1;j<=n;j++){
            tmp=(a[j]>>i)&1;
            if(pd[j]&&tmp)cnt++;
        }
        if(cnt>=k){
            for(int j=1;j<=n;j++){
                tmp=(a[j]>>i)&1;
                if(pd[j]&&!tmp)pd[j]=0;
            }
            ans+=(1<<i);
        }
    }
    cout<<ans<<'\n';
    return 0;
}
posted @   Adventurer_XIV  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示