本题的难度不是很大,主要是麻烦在一些坑点
思路:
1.将夫妻/伴侣 以键值对的形式存储起来 如:map[11111]=22222;map[22222]=11111;
好处是之后可以利用这键值对的关系进行查找
2.将参加聚会的所有人存入一个vector数组中,能排序和查找的都行
3.对参加的所以人进行判断
逻辑如下:
如果一个人如00001参加了,则利用map映射出他的对象Id,没有的情况为0。然后对 vector进行查找,判断此人是否出现在聚会中。之后将没有"对象"的人放同一个数组中并计数.
坑点:
00001会被输出为1所以要用printf输出
代码如下:
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(){
map<int,int> m;
int i,number=0,number1,number2;
vector<int> v,res;
cin>>i;
while(i--){
scanf("%d %d",&number1,&number2);
m[number1]=number2;
m[number2]=number1;
}
cin>>i;
while(i--){
int temp;
scanf("%d",&temp);
v.push_back(temp);
}
for(int a = 0;a<v.size();a++){
if(find(v.begin(),v.end(),m[v[a]])==v.end()){//这里对vector进行了查找,如果利用map映射出来的"对象"不在vector中,则必定为单人
res.push_back(v[a]);//单身队伍列
number++;//计数单身人数
}
}
sort(res.begin(),res.end());//排序
cout<<number<<"\n";
for(int a =0;a<res.size();a++){
printf("%05d",res[a]);//这里不需要用&来取地址,因为是数组对象
// cout<<res[a]这里会把00001打印为1
if(a==res.size()-1){
cout<<"\n";
}else{
cout<<" ";
}
}
return 0;
}