來源:這裏
題目描述
位運算是一個非常重要的東西。而小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;
}