前言
正文
参考题解
#include<iostream>
#include<algorithm>
using namespace std;
/* 题意: 给出n对夫妻的id,再给出m个id,求m个人中哪些人是单个人参加派对的。 (只要不是夫妻两同时出现在聚会,就算这个人是单独一个人) 思路:模拟+散列 1、根据题意需要记录哪些id是单身的,故使用single[i]表示单身者的id 2、需要记录配偶是谁,即couple[i]=j表示id为i的用户其配偶是id为j的用户,没有配偶的就设为-1 注意: 1、注意边界条件,当cnt=0是,不需输出任何id 2、注意补全前导0 */
const int maxID=1e6+10;
const int N=1e4+10;
int couple[maxID],ids[N],single[N];//couple表示夫妻关系的映射,ids保存聚会中所有人的id ,single[i]表示单身者的id
bool inParts[maxID];//inParts[i]表示id为i的用户在聚会上
int main(){
fill(couple,couple+maxID,-1);
fill(inParts,inParts+maxID,false);
int n,m,a,b;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d %d",&a,&b);
couple[a]=b;
couple[b]=a;
}
cin>>m;
int id;
for(int i=0;i<m;i++){
cin>>id;
inParts[id]=true;
ids[i]=id;
}
int cnt=0;
for(int i=0,tempId;i<m;i++){
tempId=ids[i];
if(couple[tempId]==-1||inParts[couple[tempId]]==false){
//tempId的用户是单身或者伴偶不在聚会上
single[cnt++]=tempId;
}
}
sort(single,single+cnt);//从小到大排序
cout<<cnt<<endl;
for(int i=0;i<cnt;i++){
if(i!=0)cout<<" ";
//注意前导0
printf("%05d",single[i]);
}
return 0;
}