目录
1.题目概述:
有T组测试用例,每组测试用例输入n个数a[i],你可以令a[i]变成任何一个小于等于他本身的自然数,请计算采取最优策略后这n个数进行或运算的最大值。
(或运算 : 1|0=1 , 1|1=1 , 0|0=0)
样例:
2.算法标签(tag)
位运算,贪心
3.题解:
对于位运算的题目,我们一般都要将所有的数当作二进制去处理。
对于或运算,只要当前二进制位上存在一个一,那么就可以让这个位有数值的贡献了,如果有两个数在该二进制位上存在一个1,那么只要保留一个即可。
我们可以统计出来这些数在所有二进制位上的1的个数,因为高位上的1我们肯定是要拿的,而低位上的1可以由高位转化而来,所以我们就可以从二进制最高位开始枚举,看每一位上的1的个数,进行分类讨论:
(1)如果这个位上1的个数为0,那么没有数可以在该位上进行贡献
(2)如果这个位上1的个数为1,那么就不进行改变,答案可以加上该位的贡献值
(3)如果这个位上1的个数大于1,那么就可以只保留下来一个,将多出来的1挪到低位,由进制的特性可以知道,多出来的那个1肯定可以将低位上的所有1补全。(比如我们可以把1000替换成0111,这是满足题意的)那么这时,剩下的所有低位都可以进行贡献,答案直接累加上去即可。
这个的时间复杂度是O(30*n),满足要求。
4.AC代码:

这道位运算题目挺简单的其实,但是体现了位运算题目的基本思路。