PAT乙级_1100 校庆_Python_AC解法_含疑难点

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

注意事项:

       因为笔者的编程水平以自学为主,代码结构可能比较混乱、变量命名可能不够规范。

       文章中的AC解法不一定最优,并且包含笔者强烈的个人风格,不喜勿喷,但欢迎在评论中理性讨论或者给出提升建议。

       文章中提到的疑难点仅为个人在刷题过程中所遇到的情况,如有读者存在其他疑难点,欢迎在评论中加以补充,笔者会尽量将其加入到文章内容中。


合集: 

 PAT乙级_合集_Python_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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值