概述
pta打印选课学生(python版)
题目介绍
假设全校有最多40000名学生和最多2500门课程。现给出每个学生的选课清单,要求输出每门课的选课学生名单。
输入格式:
输入的第一行是两个正整数:N(≤40000),为全校学生总数;K(≤2500),为总课程数。此后N行,每行包括一个学生姓名(3个大写英文字母+1位数字)、一个正整数C(≤20)代表该生所选的课程门数、随后是C个课程编号。简单起见,课程从1到K编号。
输出格式:
顺序输出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号和选课学生总数(之间用空格分隔),之后在第二行按字典序输出学生名单,每个学生名字占一行。
输入要求
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 5
输出要求
1 4
ANN0
BOB5
JAY9
LOR6
2 7
ANN0
BOB5
FRA8
JAY9
JOE4
KAT3
LOR6
3 1
BOB5
4 7
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
5 9
AMY7
ANN0
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
问题分析
针对排序问题,我首先想到python中的列表,为我们提供存储
而在python中,函数:列表.sort 无疑是人名字典序的最简单的方法
len(列表) 函数是返回选课人数的方法 根据上述函数,我们不妨将数据存在一个二维列表中,在根据选课编号选择对应的列表添加人名,在最后打印结果
在选择课程对应的数组时,类似于杂凑表的思想,由选课编号对应数组下标,实现人名的分类
在代码量与思想上,python的解决方法明显更加优于c语言,但作为数据结构这门课而言,python只是一种取巧的方式,还是要明白算法的含义
在后期,程序有一点限制,起初我以为是语言本身限制的,后来查阅其他人的方法,发现即使用c仍无法避免这个困境,在后面,我将指出该困境
具体代码
n,m=map(int,input().split())
test=[[]*m for i in range(n)]
g=[[] for v in range(m)]
for p in range(n):
test[p]=[q for q in input().split()]
for j in range(2,len(test[p])):
k=int(test[p][j])-1
test[p][j]=0
g[k].append(test[p][0])
for h in range(n):
test[h][0]=0
for f in range(m):
print("%d"%(f+1),end=" ")
print("%d"%(len(g[f])))
g[f].sort()
for t in g[f]:
print(t)
实验结果
是不是觉得python代码特别简洁呀
测试点5是这道题的困境,应为很容易内存超限
通过看别人的博客,我发现即使大家用c语言写仍会有这种情况,后来发现一位兄弟在博客中写道 :及时释放不需要的内存侥幸过了
收到他的影响,我释放了不需要的二维数组,果然可以通过测试点
不信的话 你可以把
for p in range(n):
test[p]=[q for q in input().split()]
for j in range(2,len(test[p])):
k=int(test[p][j])-1
test[p][j]=0
g[k].append(test[p][0])
for h in range(n):
test[h][0]=0
中的
test[p][j]=0
与
for h in range(n):
test[h][0]=0
删去试一试
分析一下
是这样的,在c语言中,针对用户自己申请的空间,利用 free() 才可以释放,而在python中,利用其”每部元素全为零则回收“的垃圾回收机制,减少程序的内存,我看了一下,应该能节省大概一半的空间
由此可见,即使释放内存就是这道题的关键点
最后
以上就是鲜艳心锁为你收集整理的【pta打印选课学生(python版) 基于python3.0】pta打印选课学生(python版)题目介绍的全部内容,希望文章能够帮你解决【pta打印选课学生(python版) 基于python3.0】pta打印选课学生(python版)题目介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复