1065 单身狗
思路:
- 用一个大小为100010的int数组Q存储所有的到场者。
- 读取所有的情侣序号,用一个map进行一一对应,即mp[a]=b, mp[b]=a。
- 用一个数组P存储所有的到场者
- 对P进行第一次遍历,把P作为Q的角标。抽到任一人时,假如map中能找到,那么数组Q中他和他的情侣全部+1。否则就自己+1
- 对P进行第二次遍历,把P作为Q的角标。假如值为2说明情侣二人都在,而值为1说明落单(情侣只来了1人或者本来就是单身),用一个vector存储。
- 对vector进行升序排序然后输出
PS:
- 注意最后输出格式用printf("%05d",x),测试点3
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int Q[100010];
int P[100010];
vector<int> ve;
map<int, int> mp;
int main(void) {
// 读取所有的情侣序号,用一个map进行一一对应,即mp[a]=b, mp[b]=a。
int n; cin >> n;
for (int i = 0; i < n; i++) {
int a, b; cin >> a >> b;
mp[a] = b;
mp[b] = a;
}
// 用一个数组P存储所有的到场者
int k; cin >> k;
for (int i = 0; i < k; i++) {
int x; cin >> x;
P[i] = x;
}
// 对P进行第一次遍历,把P作为Q的角标。抽到任一人时,假如map中能找到,那么数组Q中他和他的情侣全部+1。否则就自己+1
for (int i = 0; i < k; i++) {
Q[P[i]]++;
if (mp.find(P[i]) != mp.end()) {
Q[mp[P[i]]]++;
}
}
// 对P进行第二次遍历,把P作为Q的角标。假如值为1说明落单,用一个vector存储。
for (int i = 0; i < k; i++) {
if (Q[P[i]] == 1) {
ve.push_back(P[i]);
}
}
// 对vector进行升序排序然后输出
sort(ve.begin(), ve.end());
cout << ve.size() << endl;
for (int i = 0; i < ve.size(); i++) {
if (i != 0) { cout << " "; }
printf("%05d", ve[i]);
}
return 0;
}