『题解』Luogu P8301 [CoE R4 A] 娘子
题目大意
给定两个长度为 \(n\) 的 \(0,1\) 序列 \(a,b\)。首先,你可以选择一些 \(a_i\) 取反,即 \(0\) 变为 \(1\),\(1\) 变为 \(0\)。然后,你可以任意排列序列 \(a\)。
要求完成上述过程后,\(i \in \{1,2,\dots,n\},a_i=b_i\),求最小取反次数。
思路
既然可以任意排列,那么只需要让 \(a\) 与 \(b\) 中的 \(0,1\) 数量相等即可。
我们可以先分别统计 \(a\) 和 \(b\) 中 \(1\) 的个数。
若相等,那么 \(0\) 的个数也相等。
若不想等,那么就需要将 \(a\) 中多出的 \(1\) 或 \(0\) 取反,答案就是 \(a\) 和 \(b\) 中 \(1\) 的个数的差。
代码
#include <iostream>
#include <cmath>
using namespace std;
int n,a,b; // a和b分别代表序列a,b中的1的个数
char c; // 直接用一个字符读入就行
int main(){
cin >> n;
for(int i=1; i<=n; i++){
cin >> c;
if(c-'0') a++;
}
for(int i=1; i<=n; i++){
cin >> c;
if(c-'0') b++;
}
cout << abs(a-b) << endl; // 输出差
return 0;
}

浙公网安备 33010602011771号