链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网
题目描述
位运算是一个非常重要的东西。而小A最近在学习位运算,小A看到了一道很简单的例题,是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?
输入描述:
第一行一个整数N表示有N个数接下来一行N个数表示A1,A2…AN
输出描述:
一行输出个结果代表最大值
示例1
输入
5
1 2 4 8 16
输出
30
说明
选择2,4,8,16或的和是最大的,没有比这个更大的方案。
备注:
1≤N≤5e6,1≤Ai≤1e9
思路:直接或就完事了,,,先打出一个2^k次方的表,判断是否N个数中是否包含N个2 ^k(0<=k<=31),因为2 ^ 31次方已经大于了le9,,,所以。。。
//#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<math.h>
#include<string.h>
using namespace std ;
typedef long long ll;
#define MAXN 1000005
#define INF 0x3f3f3f3f
#define MALL (endtree *)malloc(sizeof(endtree));
int al[35];
int a[MAXN];
int main()
{
for(int i=0; i<31; ++i)
{
al[i] = pow(2,i);
// cout << a[i] << ' ';
}
memset(a, 0, sizeof(a));
ll n, sum=0, tem=0, y=0, cc=0;
cin >> n;
for(int i=0; i<n; ++i)
{
scanf("%d", &a[i]);
if(a[i] == al[cc])
{
y++;
cc++;
}
sum|=a[i];
}
if(y == n)
cout << sum-1 << '\n';
else
cout << sum << '\n';
return 0;
}