C. Ternary XOR(进制问题+思维)Codeforces Round #629 (Div. 3)

原理链接: https://codeforces.com/contest/1328/problem/C

在这里插入图片描述
测试样例:

Input
4
5
22222
5
21211
1
2
9
220222021
Output
11111
11111
11000
10211
1
1
110111011
110111010

题意: 给定一个长度为3的三进制数为 x x x,其中 x x x是由 x = a ⨀ b x=a \bigodot b x=ab运算得来的,其中 a a a b b b也为三进制数, ⨀ \bigodot 这个运算符表示为每个 x i = ( a i + b i ) % 3 x_i=(a_i+b_i)\%3 xi=(ai+bi)%3 1 ≤ i ≤ n 1\leq i\leq n 1in。让我们求出 a a a b b b使得 a ⨀ b = x a\bigodot b=x ab=x,同时 m a x ( a , b ) max(a,b) max(a,b)在所有可能的情况下的值应该最小。

解题思路: 我们的思路十分简单,为了尽量让a和b相差最小即可。我们遍历 x x x就行,然后我们确定遍历的时候尽量平分x的位置上的数,那么当x上位数为1时也就不能平分了,我们必须要分给一个a为0,一个b为1.那么这个时候大小就出现差异了。那么我们接下来的遍历就要弥补之间的差距,于是将x后面的全部给a,b补0即可。这样a和b的差距就会最小,也就是能够是 m a x ( a , b ) max(a,b) max(a,b)最小,所以我们关键要设一个标志变量判断是否开始出现差异。具体看代码。

AC代码:

/*
*邮箱:unique_powerhouse@qq.com
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 5e5+4;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int t,n;//t组测试样例,n为长度
char s1[maxn],s2[maxn],s3[maxn];//字符串。
int main(){
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	while(cin>>t){
		while(t--){
			cin>>n;
			cin>>s1;
			int cnt=0;
			int flag=false;
			s2[cnt]='1';
			s3[cnt++]='1';
			rep(i,1,n-1){
				if(s1[i]=='0'){
					s2[cnt]='0';
					s3[cnt++]='0';
				}
				else if(!flag){
					if(s1[i]=='1'){
						s2[cnt]='1';s3[cnt++]='0';
						flag=true;
					}
					else{
						s2[cnt]='1';s3[cnt++]='1';
					}
				}
				else{
					if(s1[i]=='1'){
						s2[cnt]='0';s3[cnt++]='1';
					}
					else{
						s2[cnt]='0';s3[cnt++]='2';
					}
				}
			}
			s2[cnt]='\0';s3[cnt]='\0';
			cout<<s2<<endl;
			cout<<s3<<endl;
		}
	}
	return 0;
}
posted @   unique_pursuit  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示