“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤50000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤10000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。
输出格式:
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
输入样例:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
输出样例:
5
10000 23333 44444 55555 88888
代码(含注释)
#include<bits/stdc++.h> using namespace std; int couples[100001];//储存情侣信息 int acquiry[100001]={};//确认到场的人 int sto[100001];//确认单身狗 int main(){ int cpl,all,x,y,sin=0; memset(couples,-1,sizeof(couples));//初始化-1 cin>>cpl; //在一个数组中建立情侣与情侣间的关系,互相可以从自己的位置访问到对方 for(int i=0;i<cpl;i++){ cin>>x>>y; couples[x]=y; couples[y]=x; } cin>>all; //确认所有到场的人 for(int i=0;i<all;i++){ cin>>x; acquiry[x]=1; } /*基于情侣互存地址的特性, 若此人到场(acquiry==1)且在couples中查不到(couples[i]==-1) 或者人到场,为情侣但双方有一方没到时(另一方acquiry==0), 记录此类人群,放入sto中*/ for(int i=0;i<=100000;i++){ if(acquiry[i]==1){ if(acquiry[couples[i]]!=1) sto[sin++]=i; } } //排序,输出 sort(sto,sto+sin); cout<<sin<<endl; for(int i=0;i<sin;i++){ printf("%05d",sto[i]); if(i!=sin-1) cout<<" "; } return 0; }