小A的位运算-(前缀和+位运算)

https://ac.nowcoder.com/acm/contest/549/D

题意:从N个数里面选出N-1个数要让它们或起来的值最大。

解题:

假设n个数分别存在a数组里。

从左到右连续或运算结果存在leftt数组里。

从右往左连续或运算结果存在rightt数组里。

对于(n-1)个数的或运算结果,每次抽去中间一个数,该数的左边连续或的结果 该数右边连续或的结果,动态求最大值。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

int a[5000005];
int leftt[5000005];
int rightt[5000005];
int n;

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            leftt[i]=leftt[i-1] | a[i];
        }
        for(int i=n;i>=1;i--)
            rightt[i]=rightt[i+1] | a[i];
        
        int maxx=-1;
        for(int i=1;i<=n;i++)
            maxx=max(maxx,leftt[i-1] | rightt[i+1] );
        printf("%d\n",maxx);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/10699547.html
今日推荐