PAT甲级题解-1047. Student List for Course (25)-排序

一开始是建立了course[2501][40001]数组,存储每节课的学生编号
然后for循环两层输出,但这样复杂度为O(2500*40000),也很明显导致最后时间超时
后来发现最多40000学生,每个学生最多选20门课,那么总共也就40000*20
所以直接就存储学生-课程的信息,然后排个序,按照课程从小到大,课程一样的话则按字典序
然后从头扫一遍即可,复杂度O(80000)
不过要注意一点,有些课可能并没有出现,所以要做个判断,输出x 0。

 

#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <map>
#include <cstdio>
using namespace std;

const int maxn=40000+1;
char id_name[maxn][20];
struct Stu{
    char name[20];
    int course;
    bool operator<(const Stu tmp)const{
        if(course==tmp.course){
            if(strcmp(name,tmp.name)<=0)
                return true;
            else
                return false;
        }
        else
            return course<tmp.course;
    }
}stu[maxn*20];
int main()
{
    int n,k;
    scanf("%d %d",&n,&k);
    int idx=0;
    int c;
    char name[20];
    int num[2505];
    memset(num,0,sizeof(num));
    for(int i=0;i<n;i++){
        //cin>>stu[i].name;
        scanf("%s",name);
        scanf("%d",&c);
        for(int j=0;j<c;j++){
            scanf("%d",&stu[idx].course);
            strcpy(stu[idx].name,name);
            num[stu[idx].course]++;
            idx++;
        }
        //sort(stu[i].course,stu[i].course+stu[i].c);
    }
    sort(stu,stu+idx);
    int last=0,now=0;
    for(int i=0;i<idx;i++){
        if(i==0){
            now=stu[i].course;
            for(int j=1;j<now;j++)
                printf("%d 0\n",j); //没有出现的课,也要输出0
            printf("%d %d\n",stu[i].course,num[stu[i].course]);
            printf("%s\n",stu[i].name);
            last=stu[i].course;
        }
        else{
            if(stu[i].course!=stu[i-1].course){
                now=stu[i].course;
                for(int j=last+1;j<now;j++)
                    printf("%d 0\n",j);  //没有出现的课,也要输出0
                printf("%d %d\n",stu[i].course,num[stu[i].course]);
                printf("%s\n",stu[i].name);
                last=stu[i].course;
            }
            else{
                printf("%s\n",stu[i].name);
            }
        }
    }
    return 0;
}
View Code

 

posted @ 2017-04-07 10:54  辰曦~文若  阅读(488)  评论(0编辑  收藏  举报