acwing3764. 三元数异或
先上题目链接
https://www.acwing.com/problem/content/3767/
异或又叫做不进位加法
先谈我的错误
上错误代码
我们可以看到开头处
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要尽可能的小
- 第一位数是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代码