acwing 3764.三元数异或
解题思路:题目要求max(a,b)最小,对于一个数如何分配可以达到这个目的,因为a+b的和为定值,为了使max(a,b)值最小能均分时就均分
1.当c[i]=0 必有a=b=0
2.当c[i]=1 可以使(a,b)=(1,0) 但是这样会导致两个数不等,由于我们需要max(a,b)尽可能的小,当我们第一次不均匀分配之后因为是从高位开始分配的此时 max(a,b)=a,为了使a的值不在变大,将剩下的值都分给b
3.当c[i]=2 能均分就均分,如果a>b已知 那么使(a,b)=(0,2) 否则(a,b)=(1,1)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin >> T;
while (T -- )
{
int n;
string x;
cin >> n >> x;
string a, b;
bool flag = false;
for (auto c: x)
{
if (c == '0') a += '0', b += '0';
else if (c == '1')
{
if (flag) a += '0', b += '1';
else a += '1', b += '0', flag = true;
}
else
{
if (flag) a += '0', b += '2';
else a += '1', b += '1';
}
}
cout << a << endl << b << endl;
}
return 0;
}