【pta打印选课学生(python版) 基于python3.0】

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中,利用其”每部元素全为零则回收“的垃圾回收机制,减少程序的内存,我看了一下,应该能节省大概一半的空间
在这里插入图片描述
在这里插入图片描述
由此可见,即使释放内存就是这道题的关键点

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值