题目描述
位运算是一个非常重要的东西。而小A最近在学习位运算,小A看到了一道很简单的例题,是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?
分析:
题意是说位运算, 但和二进制没有关系因为或运算跟除去某个数没有任何关系
可以把n个数从左到右或运算的结果保存在left中,将n个数从右到左或运算保存在right数组中, 当除去第i个数求其他数或运算结果时
结果 = left[i - 1] | right[i + 1]
#include<iostream>
#include<cmath>
#include<vector>
#include<string>
#include <stdio.h>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
int inf = 1 << 29;
ll l[5000006];
ll r[5000006];
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> l[i], r[i] = l[i];
for (int i = 1; i < n; i++)
l[i] |= l[i - 1];
for (int i = n - 2; i >= 0; i--)
r[i] |= r[i + 1];
ll mm = -1;
for (int i = 1; i < n - 1; i++)
{
ll temp = l[i - 1] | r[i + 1];
mm = max(mm, temp);
}
mm = max(mm, max(r[1], l[n - 2]));
cout << mm;
}