注意事项:
因为笔者的编程水平以自学为主,代码结构可能比较混乱、变量命名可能不够规范。
文章中的AC解法不一定最优,并且包含笔者强烈的个人风格,不喜勿喷,但欢迎在评论中理性讨论或者给出提升建议。
文章中提到的疑难点仅为个人在刷题过程中所遇到的情况,如有读者存在其他疑难点,欢迎在评论中加以补充,笔者会尽量将其加入到文章内容中。
合集:
题目:
1100 校庆
题目描述:
2019 年浙江大学将要庆祝成立 122 周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。
输入格式:
输入在第一行给出不超过 10^5 的正整数 N,随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母X组成的字符串)。题目保证身份证号不重复。
随后给出前来参加校庆的所有人士的信息:首先是一个不超过 10^5 的正整数 M,随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。
输出格式:
首先在第一行输出参加校庆的校友的人数。然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7-14 位给出的是 yyyymmdd 格式的生日。如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。
输入样例:
5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042
输出样例:
3
150702193604190912
代码限制:
代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB
栈限制
8192 KB
AC解法:
import sys
# 获取输入数据
inp = sys.stdin.read().splitlines() # 通过 sys 模块一次性读取所有输入内容
# 处理数据
idx = 0 # 用于标记行数,初始值为0
n = int(inp[idx]) # 取出校友数量 n
friends = set() # 创建空集合用于存储校友信息
for _ in range(n): # 遍历输入的校友信息
idx += 1 # 行数 +1
friends.add(inp[idx]) # 将该行的校友信息存入集合
idx += 1 # 行数 +1
m = int(inp[idx]) # 取出来宾数量 m
come = [] # 创建空列表用于存储来宾信息
for _ in range(m): # 遍历输入的来宾信息
idx += 1 # 行数 +1
come.append(inp[idx]) # 将该行的来宾信息存入列表
friend = [] # 创建空列表用于存储来宾中的校友信息
for c in come: # 遍历来宾
if c in friends: # 若来宾是校友
friend.append(c) # 将该校友信息加入列表
# 输出结果
print(len(friend)) # 打印来宾中的校友数
if friend: # 若来宾中存在校友
friend.sort(key=lambda x: x[6:15]) # 按身份证号中的出身日期进行升序排序
print(friend[0]) # 打印出首位(即最年长)的信息
else: # 若来宾中没有校友
come.sort(key=lambda x: x[6:15]) # 按身份证号中的出身日期进行升序排序
print(come[0]) # 打印出首位(即最年长)的信息
题目解读:
本题描述比较易懂。
先依次获取输入的校友信息和来宾信息,再找出来宾中属于校友的人,最后输出其中最年长的人的信息。
疑难点:
测试点3、测试点4运行超时
本题中影响耗时的关键在于判断来宾是否属于校友的过程,如果校友信息的存储是使用列表,那么每一次判断的时间复杂度都会是 O(n) ,就会导致超时。因此需要采用集合存储校友信息,这样可以让每一次判断的时间复杂度降至 O(1) ,即可AC通过所有测试点。上文给出的AC解法耗时约为140ms。
AC解法中使用 sys 模块一次性获取输入数据对耗时的影响约为120ms。

27

被折叠的 条评论
为什么被折叠?



