zoukankan      html  css  js  c++  java
  • 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
    ",j); //没有出现的课,也要输出0
                printf("%d %d
    ",stu[i].course,num[stu[i].course]);
                printf("%s
    ",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
    ",j);  //没有出现的课,也要输出0
                    printf("%d %d
    ",stu[i].course,num[stu[i].course]);
                    printf("%s
    ",stu[i].name);
                    last=stu[i].course;
                }
                else{
                    printf("%s
    ",stu[i].name);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    转:配置nodemanager启动weblogic服务器
    SUSE Linux下新建Weblogic 10.3非admin服务
    转weblogic 10.3新建域
    mysql 导出慢
    sql 查询效率
    js isnull 赋值方法
    linux 启动weblogic的某服务报错
    linux下oracle 10g的sqlplus无法使用
    union all 取代 select中的case when 提高查询效率
    php版判断是否为ajax请求的小demo
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6677077.html
Copyright © 2011-2022 走看看