思路
题目说要先取反,再重排。但我们可以先重排,再取反。重排时要把 a a a 和 b b b 的每个 1 1 1 对齐,再把 a a a 或 b b b 多出来的 1 1 1 在 a a a 的对应位置取反。题目问取反的最少次数,那不就是算出来 a a a 和 b b b 的 1 1 1 的个数差的绝对值吗!
举个例子:
输入:
5
1 0 1 0 1
0 1 0 1 0
输出:
1
如何做到的:
先把
a
a
a 的第三个取反,再对齐。按我们的方法,就是先把
a
a
a 排成 0 1 1 1 0
,再把第三个取反,答案也是
1
1
1
方法
按上面说的统计出 a a a 和 b b b 的 1 1 1 的个数,再输出它们的差的绝对值。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, cnt1, cnt2;
string str1, str2;
int main()
{
cin >> n >> str1;
for (int i = 0; i < str1.length(); i++) {
if (str1[i] == '1') cnt1++;
}
cin >> str2;
for (int i = 0; i < str2.length(); i++) {
if (str2[i] == '1') cnt2++;
}
cout << abs(cnt2 - cnt1);
return 0;
}