当前位置:网站首页>cf:H. Maximal AND【位运算练习 + k次操作 + 最大And】

cf:H. Maximal AND【位运算练习 + k次操作 + 最大And】

2022-07-06 00:38:00 白速龙王的回眸

分析

and就是只要有一个0这个位置还是0
所以我们统计31个bit的含1的个数
然后贪心,从最高位看起,只要有在k以内的我们就加到ans中(加2 ** i)
这个就是位运算展开成dict,然后从最高位贪心下来
只要得到某一个高位,就是赚了
所以从高位开始贪心

ac code

import sys
input = sys.stdin.readline

for _ in range(int(input())):
    n, k = list(map(int, input().split()))
    a = list(map(int, input().split()))

    bitDict = {
    }
    for i in range(31):
        bitDict[i] = 0

    for aa in a:
        #print(bin(aa)[2:].zfill(31))
        bin_str = (bin(aa)[2:].zfill(31))[::-1]
        for i in range(31):
            if bin_str[i] == '1':
                bitDict[i] += 1

    ans = 0
    # greedy
    for i in range(30, -1, -1):
        # normal add 1
        if k >= n - bitDict[i]:
            ans += 2 ** i
            k -= n - bitDict[i]
    print(ans)

总结

位运算 + and + 贪心

原网站

版权声明
本文为[白速龙王的回眸]所创,转载请带上原文链接,感谢
https://bridge-killer.blog.csdn.net/article/details/125629890