2021-07-13 AcWing 3764. 三元数异或
输入样例:
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;
}
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799175.html