2021-07-13 AcWing 3764. 三元数异或_#include

输入样例:

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

#include<iostream>
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;
}