小A的位運算 貪心

來源:這裏

題目描述

位運算是一個非常重要的東西。而小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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章