#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
unordered_map<int, int> count;
for (int i = 1; i <= n; i++) {
int id;
cin >> id;
count[id]++;
}
int changes = 0;
int a = 0;
int b = 0;
for (auto& c : count) {
int cnt = c.second;
if (cnt > 2) {
a+= cnt - 2;
} else if (cnt == 1) {
b++;
}
}
if(a >= b) changes = a;
else changes = (a + b) / 2;
cout << changes << endl;
return 0;
}
unordered_map<int, int> count
:
来统计每个同学的 ID 出现的次数。unordered_map
用来存储每个 ID 及其出现次数。
使用两个变量 a
和 b
来分别统计不同情况:
a
记录出现次数大于 2 的 ID 需要修改的次数。比如某个 ID 出现了 4 次,我们需要修改 2 次(使其出现 2 次)。b
记录出现次数为 1 的 ID 的数量。对于这些 ID,我们需要通过修改其它 ID 来配对。
关键点:
- 如果出现次数大于 2 的 ID 数量
a
大于或等于出现次数为 1 的 ID 数量b
,那么修改次数就是a
。 - 如果
a
小于b
,那么修改次数是(a + b) / 2
。这是因为a
个多余的部分可以和b
个需要配对的部分进行配对,剩下的(b-a)需要进一步修改,就是 a + (b - a)/ 2