【牛客练习赛67:位运算】B:牛牛爱位运算

牛客练习赛67:B题 牛牛爱位运算

【难度】

1 / 10 1/10 1/10
签到题

【题意】

给一个长度为 n n n 的序列 a n a_n an
你可以从中选出任意个数(或不选)
使得他们 & \& & 与运算的结果最大。
输出最大值即可。

【数据范围】

∑ n ≤ 1 0 6 \sum n\le 10^6 n106
1 ≤ a i ≤ 1 0 5 1\le a_i\le10^5 1ai105

【输入样例】

T组样例
n
a 1 ⋯ a n a_1\cdots a_n a1an

2
1 5
2 5 5

【输出样例】

5
5

【解释】

第一组数据,显然取5是最优的;
第二组数据,可以取两个5,5&5=5是最优的。

【思路】

因为是按位与,并且每个数都是正数我们易得一个结论:
a & b ≤ max ⁡ ( a , b ) a\&b\le \max(a,b) a&bmax(a,b)
那么,我们只要选择其中最大的数就行了。
多个数按位与是不会大于其中最大的数的。

【核心代码】

/*
 _            __   __          _          _
| |           \ \ / /         | |        (_)
| |__  _   _   \ V /__ _ _ __ | |     ___ _
| '_ \| | | |   \ // _` | '_ \| |    / _ \ |
| |_) | |_| |   | | (_| | | | | |___|  __/ |
|_.__/ \__, |   \_/\__,_|_| |_\_____/\___|_|
        __/ |
       |___/
*/
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        int ma = 0;
        while(n--){
            int t;scanf("%d",&t);
            ma = max(ma,t);
        }
        printf("%d\n",ma);
    }
    return 0;
}

你可能感兴趣的:(算法)