题解:CF2094E Boneca Ambalabu

· · 题解

首先将这些数转化成二进制,然后遍历每一个数,枚举每一个二进制位,先看自己这一位是几,如果是 1,那么看有几个 0,如果是 0,那么看有几个 1

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int t,n,Max,ans,a[N],sum[35][2];
signed main()
{
    cin>>t;
    while(t--)
    {
        Max=0;
        memset(sum,0,sizeof(sum));
        cin>>n;
        for(int i=1;i<=n;++i)
        {
            cin>>a[i];
            int x=a[i],cnt=0;
            for(int j=0;j<32;++j)//转二进制
            {
                sum[cnt++][x%2]++;//统计这一位几个0,几个1
                x/=2;
            }
        }
        for(int i=1;i<=n;++i)
        {
            ans=0;
            for(int j=0;j<32;++j)
            {
                if((1<<j)&a[i]) ans+=sum[j][0]*(1<<j);
                else ans+=sum[j][1]*(1<<j);
            }
            Max=max(Max,ans);
        }
        cout<<Max<<"\n";
    }
    return 0;
}