1065 单身狗

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:
输入第一行给出一个正整数 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值