【10.28 校内普及组】 最大异域和 题解
题目
解题思路
求出每个数的二进制
答案和每个数比较
从高位到低位比较
如果两个数的一位都是1
那答案往后的位都为1
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,t,x[110],ans,j,a[50],b[50];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&x[i]);
sort(x+1,x+n+1);
while (x[n]>0)
{
a[++t]=x[n]&1;
x[n]>>=1;
} //求二进制
for (int i=n-1;i>=1;i--)
{
j=0;
while (x[i]>0)
{
b[++j]=x[i]&1;
x[i]>>=1;
} //求二进制
for (int k=t;k>0;k--) //从高位比较
if (a[k]==b[k]&&b[k]==1) //都为1
{
for (int q=1;q<k;q++) //后面可以变为1
a[q]=1;
break;
}
else if (b[k]==1) a[k]=1;
}
j=1;
for (int i=1;i<=t;i++)
{
ans+=a[i]*j;
j*=2;
}
printf("%d",ans);
return 0;
}