输入样例:
4
5
22222
5
21211
1
2
9
220222021输出样例:
11111
11111
11000
10211
1
1
110111011
110111010
解析:
贪心+模拟
既然要求max(a,b)最小,所以分配时优先均匀分配
x=0 => a=0,b=0
x=1 => a,b = 0,1
x=2 => a,b = 1,1 / 0,2
这样会导致两个数不等,因为我们需要 max(a,b)尽可能小,所以在第一次不均匀分配时将较大的数分配给 a,这样无论之后如何分配,都能保证 a>b
为了使两者中的最大值(即a)保持不变,此后每当遇到不均匀分配的情况,均将所有较大的数分配给 b
using namespace std;
int main()
{
int N,n;
cin>>N;
while(N--)
{
string a="",b="";
string s;
bool flag=false;//是否有过不平均分配
cin>>n;
cin>>s;
for(auto x:s){
if(x=='2'){
if(flag){
a += '0';
b += '2';
}else{
a += '1';
b += '1';
}
}else if(x=='1'){
if(flag){
a += '0';
b += '1';
}else{
a += '1';
b += '0';
flag = true;
}
}else{
a += '0';
b += '0';
}
}
cout<<a<<endl<<b<<endl;
}
return 0;
}