三元数异或

acwing3764. 三元数异或

先上题目链接
https://www.acwing.com/problem/content/3767/

异或又叫做不进位加法
先谈我的错误
上错误代码

我们可以看到for(int i=1;i<=n;i++) cin>>
我们可以看到开头处
for(int i=1;i<=n;i++) cin>>c[i]
这个地方我的本意是输入一个数的各位上的数,也就是22222,我5次输入2,这是最大的错误,
因为这样写输入的是5个数,而不是一个5位数各个数位上的数

要完成我的想法,我们可以定义一个字符串,再利用for(auto x:c)去遍历c中的各位数

再看这题的思路
以21211为样例
题目要求我们求出max(a,b) 尽可能小的 a,b
我们先假设a>=b;这里得出一个隐形要求,a要尽可能的小

  1. 第一位数是2,那么a和b的第一位有,1和1,2和0,0和2三种情况,
    题目要求不可以有前导0,排除0和2,剩下的两个中选1和1可以使a更小,那么我们选1和1
    这时a为1…
    b为1…
    2.再看第二位数为1,有1和0,0和1,以及2和2三种情况,
    很简单的得到,选择1和0,
    这时a为11…
    b为10…
    3.经过步骤2,后面不管怎么填都可以使a比b大,那么我们直接让a为000,则b为211
    这样我们得到了,a为11000,b为10211

这便是这题的思路,下面总结下这题的一般做法,
1.如果为0,a,b都选0;
2.如果为1,有0和1,1和0,2和2三种选择,
不管是0和1,还是1和0,都比2和2更符合使a更小,
排除2和2
若前面已经判断出a>b,选择0和1,
若a=b,选择1和0;
3.如果为2,有0和2,2和0,1和1三种,排除2和0
如a>b,选0和2,
若a=b,选1和1

上AC代码在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值