来源:这里
题目描述
位运算是一个非常重要的东西。而小A最近在学习位运算,小A看到了一道很简单的例题,是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?
两种方法:
1.可以用贪心的思路,从大到小依次去更新或值ans,如果或到一个数没改变时,说明至少可以不选它,如果一直或到最小值之前ans一直在增大,说明可以不选最小的那个。
2.预处理前缀和后缀,扫一遍就行了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 5e6+5;
int arr[maxn];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;++i)
{
cin>>arr[i];
}
sort(arr,arr+n,cmp);
int ans=arr[0];
int flag=1;
for(int i=1;i<n-1;++i)
{
if((ans|arr[i])==ans)
{
flag=0;
}
ans=ans|arr[i];
//cout<<ans<<" !!!"<<endl;
}
if(flag==0)
{
ans=ans|arr[n-1];
}
cout<<ans<<endl;
}
return 0;
}
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn = 5000005;
ll arr[maxn];
ll a[maxn];
ll b[maxn];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;++i)
{
cin>>arr[i];
}
ll temp = arr[0];
a[0]=0;
a[1]=arr[0];
for(int i=2;i<n;++i)
{
a[i] = temp|arr[i-1];
temp = a[i];
}
temp = arr[n-1];
b[n-1]=0;
b[n-2]=arr[n-1];
for(int i=n-3;i>=0;--i)
{
b[i] = temp | arr[i+1];
temp = b[i];
}
ll ans = -1<<30;
for(int i=0;i<n;++i)
{
ll t=a[i] | b[i];
ans=max(ans,t);
}
cout<<ans<<endl;
}
return 0;
}