题目链接
题意:
给你三个十位的二进制数字,你可以任意改变他们的“0”和“1”的位置,求这三个二进制数字异或的最大值。
思路:
如果三个二进制数字中1的数量小于10,那么直接输出所有1然后补零,如果大于10,已知两个1可以相互抵消变为0,那么可以先抵消掉能够抵消的1,然后剩余的1再排列(思路有点抽象,具体还是要看代码)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=2e5+7;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int a[3],num=0;
memset(a,0,sizeof a);
for(int i=0;i<3;i++)
{
for(int j=0;j<10;j++)
{
char c;
cin>>c;
if(c=='1')
{
a[i]++;
num++;
}
}
}
sort(a,a+3,cmp);
if(num>10)
{
while(a[2]>0&&num>10)
{
a[1]--;a[2]--;num-=2;
}
if(num>10)
{
for(int i=0;i<10;i++)
{
if(i<20-num)
cout<<1;
else
cout<<0;
}
cout<<endl;
}
else
{
for(int i=0;i<10;i++)
{
if(i<num)
cout<<1;
else
cout<<0;
}
cout<<endl;
}
}
else
{
for(int i=0;i<10;i++)
{
if(i<num)
cout<<1;
else
cout<<0;
}
cout<<endl;
}
}
return 0;
}