链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网
位运算是一个非常重要的东西。
而小A最近在学习位运算,小A看到了一道很简单的例题,
是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?
思路:预处理了一下前缀L数组和后缀R数组,然后枚举那个不选的数就可以了,每次更新ans = max(ans, L[i - 1] | R[i + 1]) 。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 6e6 + 5;
int a[maxn];
int L[maxn], R[maxn];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
L[i] = L[i - 1] | a[i];
}
for (int i = n; i >= 1; i--) {
R[i] = R[i + 1] | a[i];
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, (L[i - 1] | R[i + 1]) * 1LL);
}
cout << ans << endl;
return 0;
}
牛客小白月赛13 D题
最新推荐文章于 2022-11-24 00:24:28 发布