通过题目描述我们可以用map来存储某个id对应有多少人,多与两个的话存储起来,这些人的id都要改,而对于落单的人id要看情况改,如果落单的人更多,我们就需要优先将团体中多出来的人匹配落单的人,剩余的落单的人除以二在加上前面的数就是我们的答案,如果团体中多出的人更多,我们仍然需要优先和落单的人匹配,同时剩下的id也是都要改,根据这个我们可以写出代码:
上代码
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int main(void)
{
int n; cin >> n;
map <int, int> mp;
for (int i = 0; i < n; i++) {
int x; cin >> x;
mp[x]++;
}
int cnt1 = 0, cnt2 = 0;//分别表示团体中多出来的人以及其他落单的人
for (auto p = mp.begin(); p != mp.end(); p++) {
if ((*p).second >= 2) cnt1 += ((*p).second - 2);
else cnt2++;
}
if (cnt1 > cnt2)//分情况,如果团体中多出来的人更多,那么团体中的人都要改id,同时要将剩下没有匹配的落单的人进行匹配
cout << cnt2 + (cnt1 - cnt2) << endl;//团体中多出来的人比落单的人更多,需要优先与落单的人匹配,然后再将多出来的人配对
else
cout << cnt1 + (cnt2 - cnt1) / 2 << endl;//落单的人更多,先将团体中的人都与落单的人配对,再将其他落单的人进行匹配
return 0;
}