『题解』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;
}
posted @ 2022-04-27 13:43  仙山有茗  阅读(52)  评论(0)    收藏  举报