来源:这里

题目描述

位运算是一个非常重要的东西。而小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;
}
Last modification:September 19th, 2019 at 12:09 am
如果觉得我的文章对你有用,请随意赞赏