小A的位运算

题目描述

位运算是一个非常重要的东西。而小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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值