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
  • 相关阅读:
    http://www.jdon.com/jivejdon/thread/37340
    我的英语死在类似的问题上
    Linux之read命令使用
    SIP注册呼叫流程简介
    sh里的变量 $0 $1 $$ $#
    LTE 逻辑分层和接口协议
    LTE语音业务VOLTE
    shell编程——if语句 if z n f eq ne lt
    高通QXDM抓modem log
    LTE与VOLTE基础知识
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6677077.html
Copyright © 2011-2022 走看看