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;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM