C. Ternary XOR
题目链接-C. Ternary XOR
题目大意
三进制的数
c
c
c由三进制的数
a
a
a和
b
b
b通过操作
c
i
=
(
a
i
+
b
i
)
%
3
ci=(ai+bi)\%3
ci=(ai+bi)%3获得,给定
c
c
c求出
a
a
a和
b
b
b并使得
m
a
x
(
a
,
b
)
max(a,b)
max(a,b)最小,且c的三进制数首位保证为2
解题思路
贪心
至于
2
2
2和
1
1
1直接均分即可,如果是
1
1
1,分给
a
,
b
a,b
a,b必定有一个是
1
1
1,另一个自然就为
0
0
0,假设该位上
a
a
a分到
1
1
1,把
a
a
a后面全变成0即可;因为这一位
a
a
a大于
b
b
b,后面无论怎么分
a
a
a都会大于
b
b
b,这样即保证了
m
a
x
(
a
,
b
)
max(a,b)
max(a,b)最小
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
#define endl '\n'
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int n;
char s[N],a[N],b[N];
signed main(){
int t;
cin>>t;
while(t--){
cin>>n;
bool ass=0;
cin>>s;
for(int i=0;i<n;i++){
if(ass){
a[i]='0';
b[i]=s[i];
continue;
}
if(s[i]=='2')
a[i]=b[i]='1';
else if(s[i]=='1'){
a[i]='1';
b[i]='0';
ass=1;
}
else
a[i]=b[i]='0';
}
for(int i=0;i<n;i++)
cout<<a[i];
cout<<endl;
for(int i=0;i<n;i++)
cout<<b[i];
cout<<endl;
}
return 0;
}