题目:从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
第一行:正整数N(已知伴侣的对数)。
随后N行:每行给出一对伴侣。每人对应一个 ID 号,为 5 位数字(从 00000 到 99999)。
第N+2行:正整数M(参加派对的总人数)。
第N+3行:M 位客人的 ID,以空格分隔。
注意:题目保证无人重婚或脚踩两条船
输出格式:
第一行输出落单客人的总人数。
第二行按 ID 递增顺序列出落单的客人。
思路:根据题目可知,单身狗是指哪些没有伴侣或有伴侣但伴侣没来的人。所以为了判断一个人是否有伴侣和伴侣是否来了,可以使用map来记录丈夫到妻子、妻子到丈夫的映射。
代码:
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main(){
int n;cin >> n;
map<string,string> mpFQ;
map<string,string> mpQF;
for(int i = 0 ; i < n ; i ++){
string sf,sq;cin >> sf >> sq;
mpFQ.insert(make_pair(sf,sq)); // 丈-妻
mpQF.insert(make_pair(sq,sf)); // 妻-丈
}
int m;cin >> m;
vector<string> v;
map<string,int> mp; // 用于快速判断某人是否参加了派对
for(int i = 0 ; i < m ; i ++){
string s;cin >> s;
v.push_back(s); // 记录参加派对的人
mp.insert(make_pair(s,1));
}
vector<string> singleDog;
for(int i = 0 ; i < m ; i ++){
// 是丈夫且妻子来了
bool isZh = mpFQ.find(v[i]) != mpFQ.end() && mp.find(mpFQ[v[i]]) != mp.end();
// 是妻子且丈夫来了
bool isQi = mpQF.find(v[i]) != mpQF.end() && mp.find(mpQF[v[i]]) != mp.end();
if(isZh || isQi){
// 在聚会上不是单身狗:伴侣一起来了
continue;
}else{
// 是聚会上的单身狗:没有伴侣或伴侣没来
singleDog.push_back(v[i]);
}
}
// 按题目要求输出
int len = singleDog.size();
sort(singleDog.begin(),singleDog.end());
cout << len << endl;
for(int i = 0 ; i < len ; i ++){
cout << singleDog[i];
if(i != len-1)
cout << " ";
else
cout << endl;
}
return 0;
}