打印选课学生名单

假设全校有最多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
#include
#include
typedef struct stu* node;
struct stu
{
    char* name;
    node next;
};
typedef struct
{
    int sum;
    node st;
}Class;
node createNode(char *na);
void add(Class* course,int d,node newnode);
void Print(Class* course,int K)
{
    for(int i=1;i<=K;i++)
    {
        printf("%d %d\n",i,course[i].sum);
        node cur=course[i].st;
        while(cur!=NULL)
        {
            printf("%s\n",cur->name);
            cur=cur->next;
        }
    }
}
int comp(char *z,char *x)
{
    for(int i=0;i<4;i++)
    {
        if(z[i]x[i])return 1;
    }
    return 0;
}
int main()
{
    int N,K;
    scanf("%d%d",&N,&K);
    Class course[K+1];
    for(int i=1;i<=K;i++)
    {
        course[i].st=NULL;
        course[i].sum=0;
    }
    char **names=(char**)malloc((N)*sizeof(char*));
    for(int i=0;iname=na;
    newnode->next=NULL;
    return newnode;
}
void add(Class* course,int d,node newnode)
{
    course[d].sum++;
    if(course[d].st==NULL)
    {
        course[d].st=newnode;
    }
    else
    {
        node pre=NULL,cur=course[d].st;
        while(cur!=NULL)
        {
            if(comp(cur->name,newnode->name))
            {
                if(pre==NULL)
                {
                    newnode->next=cur;
                    course[d].st=newnode;
                }
                else
                {
                    newnode->next=cur;
                    pre->next=newnode;
                }
                break;
            }
            else
            {
                pre=cur;
                cur=cur->next;
            }
        }
        if(cur==NULL)pre->next=newnode;
    }
    return;
}

暴力算法,所以最后一个测试点会超时,如何避免超时,我会在之后的文章中提到

你可能感兴趣的:(算法,数据结构)