P8301 题解
[CoE R4 A/Stoi2041] 娘子
题目传送门
题目描述
给定两个长度均为 \(n\) 的 \(0\),\(1\) 序列 \(a\),\(b\),首先,你可以选择一些 \(a_i\) 取反,即 \(0\) 变为 \(1\),\(1\) 变为 \(0\),然后,任意排列序列 \(a\)。
要求上述过程结束后 \(a_i\) 等于 \(b_i\),求取反的最少次数。
输入格式
第一行一个正整数 \(n\)。第二行 \(n\) 个数字表示序列 \(a\)。第三行 \(n\) 个数字表示序列 \(b\)。
输出格式
一个整数表示答案。
样例 #1
样例输入 #1
3
110
101
样例输出 #1
0
样例 #2
样例输入 #2
5
10010
00100
样例输出 #2
1
提示
样例解释
输入 #1:将 \(a = 110\) 重排为 \(a = 101\) 即可达到题目要求,故取反的最少次数为 \(0\)。
输入 #2:将 \(a = 10010\) 的第四位取反(从左往右计数),得 \(a=10000\),然后再重排得到 \(a=00100\) 即可达到题目要求,故取反的最少次数为 \(1\)。
数据规模
- 对于 \(10\%\) 的数据,\(n = 1\);
- 对于另外 \(20\%\) 的数据,\(b_i = 0\);
- 对于另外 \(20\%\) 的数据,\(b_i = 1\);
- 对于 \(100\%\) 的数据,\(1 \le n \le 10^3\),\(a_i \in \{0, 1\}\),\(b_i \in \{0, 1\}\)。
题解
首先,我们知道,字符串 \(a\) 和 \(b\) 的长度是相等的,我们又需要把 \(a\) 变成 \(b\),所以 \(a\) 和 \(b\) 的 \(1\) 和 \(0\) 的个数是相等的。
所以我们只需要求出 \(a\) 和 \(b\) 的 \(0\) 或 \(1\) 的个数的差就可以了。
贴个代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
string a, b;
int ca[2], cb[2], n;
int main() {
cin >> n >> a >> b;
for (int i = 0; i < n; i++) {
ca[a[i] - '0']++;
}
for (int i = 0; i < n; i++) {
cb[b[i] - '0']++;
}
cout << abs(ca[0] - cb[0]);
return 0;
}