题意
给出很多情侣,开聚会,看聚会上的哪些人是“单身狗”
思路
- 开2个
unordered_map<int, int>
来记住情侣关系,记住谁有伴侣谁没有 - 开一个
flag
数组,标记出现在聚会上的人 - “单身狗”要么是本来就没有伴侣的,要么是伴侣没有一起来聚会的
代码
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <string.h>
using namespace std;
int flag[100010] = {0};
int main() {
int couples, u, v;
scanf("%d", &couples);
unordered_map<int, int> mp; // 记住情侣关系
unordered_map<int, int> has_couple; // 记录谁有伴侣谁没有
for(int i = 0; i < couples; i++) {
scanf("%d %d", &u, &v);
mp[u] = v;
mp[v] = u;
has_couple[u] = has_couple[v] = 1;
}
int num;
scanf("%d", &num);
vector<int> dogs;
vector<int> party;
party.resize(num);
for(int i = 0; i < num; i++) {
scanf("%d", &party[i]);
flag[party[i]] = 1;
}
for(auto i: party) {
// 没有伴侣 || 伴侣没来 就被我们视为单身狗
if(has_couple[i] == 0 || flag[mp[i]] == 0)
dogs.emplace_back(i);
}
sort(dogs.begin(), dogs.end());
cout << dogs.size() << endl;
// 注意如果没有单身狗就不用输出名单了
if(dogs.size() != 0) {
printf("%05d", dogs.front());
for(int i = 1; i < dogs.size(); i++)
printf(" %05d", dogs[i]);
}
return 0;
}