首页 > 其他 > 详细

7-14 打印选课学生名单(25 分)

时间:2017-10-21 18:32:10      阅读:729      评论:0      收藏:0      [点我收藏+]

假设全校有最多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 分)

原文:http://www.cnblogs.com/8023spz/p/7705422.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!