题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805352359378944
题目大意:有些人单身,有些人有伴侣。先给出N
对伴侣的ID。再给出M
个参加party的ID。party中没有伴侣的和伴侣没来的都算single。求single人的个数,并排序输出。
思路:多开几个数组记录就好。partner
记录伴侣ID,没有就是-1
。因为不扫描到最后不知道一个人的伴侣有没有来,所以不好在线判断single与否,因此现将参与party的人都先记录下来,来的known[id]
置为true
。第二遍扫描时将single的和伴侣没来的都加入结果vector中。
for (int i = 0; i < M; i++) {
int num;
scanf("%d", &num);
guest.push_back(num);
known[num] = true;
}
for (int i = 0; i < guest.size(); i++) {
if (partner[guest[i]] == -1)
single.push_back(guest[i]);
else {
if (!known[partner[guest[i]]])
single.push_back(guest[i]);
}
}
完整代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
using namespace std;
int partner[1000000];
bool known[1000000];
vector<int> single;
vector<int> guest;
int main() {
fill(partner, partner+100000, -1);
int N, M;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
int n1, n2;
scanf("%d %d", &n1, &n2);
partner[n1] = n2;
partner[n2] = n1;
}
scanf("%d", &M);
for (int i = 0; i < M; i++) {
int num;
scanf("%d", &num);
guest.push_back(num);
known[num] = true;
}
for (int i = 0; i < guest.size(); i++) {
if (partner[guest[i]] == -1)
single.push_back(guest[i]);
else {
if (!known[partner[guest[i]]])
single.push_back(guest[i]);
}
}
sort(single.begin(), single.end());
printf("%d\n", single.size());
if (single.size())
printf("%05d", single[0]);
for (int i = 1; i < single.size(); i++)
printf(" %05d", single[i]);
return 0;
}