PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642

题目描述:


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

输入格式:


输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣

——为方便起见,每人对应一个 ID 号,为 5 位数字(从0000099999),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

题目要求:


作者     			CHEN, Yue
单位 浙江大学
代码长度限制 16 KB
时间限制 200 ms
内存限制 64 MB

坑点:


  1. 对于夫妻客人的存储的时候,首先我也选择了使用 map<int , int > 但是题目中 客人 的 ID 值可以是0,

这会出现什么问题呢? 若刚好某个人的 ID 值是 0 的话,当我们查找 map 的时候,返回的 0 值 不好判断

是没有这个客人 , 还是找到了符合要去的对象 ID 解决方法很简单,可以多输入的时候如果 ID0 的话

我们转化为另外一个数即可,但这样会需要增加很多的判断,所以我采用了 map<string , string>

  1. 存储那些 有对象但是不确定其对象是否在场的时候,我首先采取的是,直接使用 vector 来进行存储,

    在检查其对象是否在场的时候,会需要依次比对(就算使用 sort 函数,写二分查找 也会耗很多时间) ,

    (题主注意是,没有去尝试用二分,所以运行超时了)。 所以选择了直接再用一个 map<string , int>

    注意找不到的时候会返回 0 ,所以我们 int 存储时,不能存储 0

  2. 如果这样还是会超时的话, 就将所有的cin cout 换成 scanf printf

    这里需要知道的是,利用 scanf 进行输入 string 类型时,需要确定分配内存的大小,不然会报错

    然后进行 printf 输出 string 类型的时候,要利用 c_str() 函数,转换为字符数组输出。

解题思路:


存储各夫妻对应关系

/*
1. 一看题目找 单身狗 ,瞬间觉得好简单,不就是把没有 对象 的人拎出来,哈哈哈哈哈
题目中明确没有一个人有两个人对象的情况,那么久可以很自然的想到一对夫妻是一一对应的。
一对一对的存储,很容易想到使用 map 来存储夫妻的 key 和 value ,
而题目中明确说明,夫妻是一一对应的,也就是 可以通过 value 找到 key ,
所以说如一对夫妻的时候,我们就把 夫妻分别作为 key 和 value 的 map 存储起来。
至于 map 中的数据类型,我选择了使用 string 对应 string
*/
a.resize(5);
b.resize(5);
t.resize(5); // 重新分配内存,为了使用 scanf 对 string 类型进行输入。
while(n--){
scanf("%s %s" , &a[0] , &b[0]) ;
mp.insert(pair<string , string>( a , b )) ; // 插入《夫,妻》
mp.insert(pair<string , string>( b , a )) ; // 插入《妻,夫》
}

找出落单客人

/*
2. 然后就应该是找出里面的单身狗啦 这一步的处理,我分成了两部分来进行。
第一部分,这里需要理解好 落单客人 和 单身狗 的区别。
落单客人 包括 单身狗 以及 有对象但是其对象不在现场的客人。
存储满足要求的落单客人 输出时要按照 ID 的升序,故采用 set 容器进行存储
*/
for(int i = 0 ; i < k ; i ++){
scanf("%s" , &t[0]) ;
if(mp[t] == "") // 如果夫妻关系 map 里面没有这个人的对象,那么他是单身狗,符合要求,加入 st
st.insert(t) ;
else { // 如果他是有对象的人,先记录下来,待会再来检查一下他对象在不在场
cus.push_back(t) ;
test.insert(pair<string , int>(t , i + 1)) ; // 给他安排一个序号 (从 1 开始)
}
} /*
第二部分,就是从第一部分里面记录的有对象的客人,如果他的对象不在场,那么久加入落单客人行列中。 在 mp 中找到 cus[i] 的夫/妻的 ID,根据此 ID 查找我们第一部分时给他的序号 ,
若果序号不为 0 说明 他们夫妻均在场 (找不到序号的时候返回 0 )
找不到序号的时候,那就说明他今晚是 落单客人,得加入 落单客人 的行列中。
*/
for(int i = 0 ; i < cus.size() ; i++)
if(test[mp[cus[i]]] != 0)
continue ;
else st.insert(cus[i]) ;

按要求输出落单客人 ID

	printf("%d\n" , st.size()) ; // 打印落单客人的人数
int i = 1 ;
// 通过迭代器访问 set 中的元素
for(set<string>::iterator it = st.begin(); it != st.end() ;i++, it++){
printf("%s%c",(*(it)).c_str() , (i != st.size())?' ':'\n');
}

完整代码


#include<bits/stdc++.h>
using namespace std ;
map<string , string> mp ;
map<string , int> test ;
set<string> st ;
vector<string> cus ;
int n , k ;
string a , b , t ;
int main(){
scanf("%d" , &n) ;
a.resize(5) ;
b.resize(5) ;
t.resize(5) ;
while(n--){
// scanf("%d %d", &a , &b ) ;
scanf("%s %s" , &a[0] , &b[0]) ;
mp.insert(pair<string , string>(a , b)) ;
mp.insert(pair<string , string>(b , a)) ;
}
scanf("%d" , &k) ;
for(int i = 0 ; i < k ; i ++){
scanf("%s" , &t[0]) ;
if(mp[t] == "")
st.insert(t) ;
else {
cus.push_back(t) ;
test.insert(pair<string , int>(t , i + 1)) ;
}
}
// for(int i = 0 ; i < cus.size() ; i++){
// cout<<cus[i]<<endl ;
// }
for(int i = 0 ; i < cus.size() ;i ++)
if(test[mp[cus[i]]] != 0) continue ;
else st.insert(cus[i]) ;
printf("%d\n" , st.size()) ;
int i = 1 ;
for(set<string>::iterator it = st.begin() ; it != st.end() ;i++ , it++)
printf("%s%c" , (*(it)).c_str() , (i != st.size())?' ':'\n') ;
return 0 ;
}

其他博客

PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642的更多相关文章

  1. PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...

  2. PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) 凌宸1642 题目描述: A number that will ...

  3. PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642 题目描述: With the 2010 FIFA World Cu ...

  4. PAT (Advanced Level) Practice 1005 Spell It Right (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) 凌宸1642 题目描述: Given a non-negative integer N ...

  5. PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642 题目描述: Calculate a+b and output the sum i ...

  6. PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642 题目描述: 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每 ...

  7. PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642 题目描述 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下 ...

  8. PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) 凌宸1642

    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) 凌宸1642 题目描述: At the beginning of ever ...

  9. PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642

    PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642 题目描述: This time, you are suppos ...

随机推荐

  1. DRM & 音视频 & 防盗链

    DRM & 音视频 & 防盗链 DRM Digital Rights Management / 数字版权管理 https://en.wikipedia.org/wiki/Digital ...

  2. CSS & Architecture

    CSS & Architecture https://sass-guidelin.es/#architecture https://sass-guidelin.es/#the-7-1-patt ...

  3. GitHub Classroom

    GitHub Classroom GitHub Education https://classroom.github.com/classrooms https://classroom.github.c ...

  4. nasm astrcat函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  5. ALGO基础(一)—— 排序

    ALGO基础(一)-- 排序 冒选插希快归堆,以下均为从小到大排 1 冒泡排序 描述: 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一 ...

  6. 安鸾渗透实战平台-PHP代码练习

    0x00 前言 --工欲善其事,必先利其器 0x01 代码理解 (1)linux命令 pwd 查看当前工作目录的完整路径 cd / 切换到根目录 ls / 查看根目录下的所有目录和文件 cat /[f ...

  7. 后端程序员之路 54、go 日志库

    一个朋友写的日志库 https://github.com/vizee/echo go get -u -v github.com/vizee/echo package main import (    ...

  8. Flask:处理Web表单

    尽管 Flask 的请求对象提供的信息足以处理 Web 表单,但有些任务很单调,而且要重复操作.比如,生成表单的 HTML 代码和验证提交的表单数据.Flask-WTF 扩展可以把处理 Web 表单的 ...

  9. C# 中 string.Empty、""、null的差别

    一.string.Empty 和 ""                                                           原文1   原文2 1. ...

  10. 微信小程序去除页面滚动条

    ::-webkit-scrollbar { width: 0; height: 0; color: transparent; display: none; } 父级元素(滚动的元素) width:10 ...