“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 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
这次的25分题感觉还是很简单的,我用的是stl中的map,和set,虽然我stl掌握的不好,但是这样的题一读题我感觉就是为map,set量身定做的,当然数组标记也是可以的,不如说大部分人都用的是数组标记,然后遍历判断,我第一反应是stl,所以我用的是map,set。
PS:一开始只得了21分,看了老半天,原来是输出第一个的时候格式错误了,疏忽了。
稍微整理一下map,set的一部分用法。
map
用 erase(x) 删除一个元素。
其中 x 可以是具体的数或迭代器。删除 Map 中不存在的元素会被忽略
count() 用来查找Map中某个某个键值出现的次数,这个函数在Map只可能出现0或1次
Size()是map的成员函数,其返回值一个无符号整数,表示map中元素的个数。时间复杂度O(1)
Map赋值的两种方法:
用insert函数插入pair数据
用数组方式插入数据。
以上两种用法的区别:
用insert函数插入数据,在数据的插入上涉及到map关键字的唯一性这个概念。即当map中有这个关键字时,insert操作无效的。
用数组方式它可以覆盖以前该关键字对应的值。
map的单个value可以像数组那样使用下标输出。
要输出所有元素需要使用迭代器依次遍历。
输出it->first对应的关键字key
输出it->second对应的为其value
set
用 erase(x) 删除元素。
其中 x 可以是具体的数或迭代器。删除 set 中不存在的元素 会被忽略。
set不能像数组的输出那样使用下标输出,需要使用迭代器依次遍历。
使用迭代器时,要写成it!=a.end();
输出的是*it
如图,c++11中,set可以像数组一样赋初值,但是赋值完成后set中的元素是自动排好序的。
set没有尾部插入函数push_back(),元素的插入一般使用insert进行动态检索插入。
a.insert(x) --在集合中a中插入元素x,x 的类型必须与 set 的元素类型一致。如果插入的元素在 set中已存在则会忽略。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<map>
#include<set>
using namespace std;
int main(){
map<int,int> a;
set<int> b;
int n;
scanf("%d",&n);
while(n--){
int x,y;
scanf("%d%d",&x,&y);
a[x]=y;
}
int f,t;
scanf("%d",&f);
t=f;
while(f--){
int m;
scanf("%d",&m);
b.insert(m);
}
set<int>::iterator it;
for(it=b.begin();it!=b.end();it++){
if(!b.count(a[*it])){
continue;
}
else{
b.erase(*it);
b.erase(a[*it]);
t-=2;
}
}
printf("%d\n",t);
if(t!=0){
it=b.begin();
printf("%05d",*it);
it++;
for(;it!=b.end();it++){
printf(" %05d",*it);
}
}
else
printf("");
return 0;
}