7-14 打印选课学生名单(25 分)
Posted 给杰瑞一块奶酪~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-14 打印选课学生名单(25 分)相关的知识,希望对你有一定的参考价值。
假设全校有最多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
一开始用数组,全用数组,每次排序,最后一个测试点内存超限,时间也耗,后来先把名字排序,再记录,就好了。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct stu { char name[5]; int num; int choice[20]; }s[40000]; int cmp(const void *a,const void *b) { struct stu *aa = (void *)a,*bb = (void *)b; return strcmp(aa->name,bb->name)>0?1:-1; } typedef struct Node { int Data; struct Node *Next; }Node; int main() { int n,m; Node *head[2501][2]; scanf("%d%d",&n,&m); for(int i = 1;i <= m;i ++) { head[i][0] = (Node *)malloc(sizeof(Node)); head[i][0] -> Data = 0; head[i][0] -> Next = NULL; head[i][1] = head[i][0]; } for(int i = 0;i < n;i ++) { scanf("%s",s[i].name); scanf("%d",&s[i].num); for(int j = 0;j < s[i].num;j ++) { scanf("%d",&s[i].choice[j]); head[s[i].choice[j]][0] -> Data += 1; } } qsort(s,n,sizeof(s[0]),cmp); for(int i = 0;i < n;i ++) { for(int j = 0;j < s[i].num;j ++) { Node *p = (Node *)malloc(sizeof(Node)); p -> Data = i; p -> Next = NULL; head[s[i].choice[j]][1] -> Next = p; head[s[i].choice[j]][1] = p; } } for(int i = 1;i <= m;i ++) { printf("%d %d\n",i,head[i][0] -> Data); head[i][1] = head[i][0] -> Next; while(head[i][1]) { puts(s[head[i][1] -> Data].name); head[i][1] = head[i][1] -> Next; } } }
以上是关于7-14 打印选课学生名单(25 分)的主要内容,如果未能解决你的问题,请参考以下文章
PAT甲级1047 Student List for Course (25 分)
PAT甲级1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)