Loading

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;
}
posted @ 2023-03-01 22:07  chengning0909  阅读(10)  评论(0编辑  收藏  举报