PAT-B 1095 解码PAT准考证(C语言)

题目

链接:PAT (Basic Level) Practice 1095 解码PAT准考证

PAT 准考证号由 4 部分组成:

  • 第 1 位是级别,即 T代表顶级;A 代表甲级;B 代表乙级;
  • 第 2~4 位是考场编号,范围从 101 到 999;
  • 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
  • 最后 11~13 位是考生编号,范围从 000 到 999。

现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。

输入格式:

输入首先在一行中给出两个正整数N(≤10^4)M(≤100),分别为考生人数和统计要求的个数。
接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。
考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中

  • 类型 为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令 则给出代表指定级别的字母;
  • 类型为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令 则给出指定考场的编号;
  • 类型为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令 则给出指定日期,格式与准考证上日期相同。

输出格式:

对每项统计要求,首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即复制输入给出的要求。随后输出相应的统计结果:

  • 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
  • 类型 为 2 的指令,按 人数 总分 的格式输出;
  • 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。

如果查询结果为空,则输出 NA

输入样例:

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

输出样例:

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA

思路

这道题磨了一个多星期还是没解决,现在还只能过一个点15分,3个点超时(用了三个for循环嵌套,不超时才怪)。


PAT-B95.png

先留着过些日子再改吧,欢迎讨论。

  • 类型1的要求涉及成绩和级别(准考证号);
  • 类型2的要求涉及考场编号和考场人数和成绩;
  • 类型3的要求涉及日期和考场考生人数。

所以用两个结构体数组分别存入考生和考场信息,考生信息包括准考证号、和成绩,考场信息包括考场编号和考场人数;考场编号用考场结构体数组下标表示。


代码

#include<stdio.h>
#include<string.h>

typedef struct student{
    int grade;
    char Tnumb[14];
}Student;

typedef struct eroom{
    int Pamou;
    int Tgrade;
}Eroom;

int main()
{
    int N, M;
    scanf("%d %d", &N, &M);
    Student S[N];
    Eroom E[1000];
    for(int i = 101; i < 1000; i++){      //结构体初始化
        E[i].Pamou = 0;
        E[i].Tgrade = 0;
    }
    for(int i = 0; i < N; i++){
        char str[14];
        int gra, En;
        scanf("%s %d", str, &gra);
        strcpy(S[i].Tnumb, str);
        S[i].grade = gra;
        En = (S[i].Tnumb[1] - '0') * 100 + (S[i].Tnumb[2] - '0') * 10 + (S[i].Tnumb[3] - '0');
        E[En].Pamou += 1;
        E[En].Tgrade += gra;
    }
    
    for(int i = 0; i < M; i++){
        int type = 0, flag = 0;
        scanf("%d", &type);
        if(type == 1){                  //类型1
            char level;
            Student S2[N];
            int cnt = 0;
            scanf(" %c", &level);
            for(int j = 0; j < N; j++){
                if(S[j].Tnumb[0] == level){
                    strcpy(S2[cnt].Tnumb, S[j].Tnumb);       //得到符合条件的学生数据
                    S2[cnt].grade = S[j].grade;
                    cnt++;
                    flag = 1;
                }
            }
            Student temp;
            for(int p = 0; p < cnt; p++){       //排序
                for(int q = p; q < cnt; q++){
                    if((S2[p].grade < S2[q].grade)||(S2[p].grade == S2[q].grade && S2[p].Tnumb < S2[q].Tnumb)){
                        //temp = S2[p];
                        strcpy(temp.Tnumb, S2[p].Tnumb);
                        temp.grade = S2[p].grade;
                        //S2[p] = S2[q];
                        strcpy(S2[p].Tnumb, S2[q].Tnumb);
                        S2[p].grade = S2[q].grade;
                        //S2[q] = temp;
                        strcpy(S2[q].Tnumb, temp.Tnumb);
                        S2[q].grade = temp.grade;
                    }
                }
            }
            printf("Case %d: %d %c\n", i+1, type, level);
            if(flag == 0){
                printf("NA\n");
            }
            else{
                for(int k = 0; k < cnt; k++){
                    printf("%s %d\n", S2[k].Tnumb, S2[k].grade);
                }
            }
        }
        else if(type == 2){             //类型2
            int Enumb;
            scanf("%d", &Enumb);
            printf("Case %d: %d %03d\n", i+1, type, Enumb);
            if(E[Enumb].Pamou == 0){
                printf("NA\n");
            }
            else{
                printf("%d %d\n", E[Enumb].Pamou, E[Enumb].Tgrade);
            }
        }
        else if(type == 3){             //类型3
            int data;
            scanf("%d", &data);
            Eroom E2[1000];
            for(int j = 101; j < 1000; j++){      //结构体初始化
                E2[j].Pamou = 0;
                E2[j].Tgrade = 0;
            }
            int dat2,cnt2 = 0,en, flag3 = 0;
            for(int j = 0; j < N; j++){
                dat2 = (S[j].Tnumb[4] - '0') * 100000 + (S[j].Tnumb[5] - '0') * 10000 + (S[j].Tnumb[6] - '0')* 1000 + (S[j].Tnumb[7] - '0') * 100+ (S[j].Tnumb[8] - '0') * 10 + (S[j].Tnumb[9] - '0');
                if(data == dat2){
                    en = (S[j].Tnumb[1] - '0') * 100 + (S[j].Tnumb[2] - '0') * 10 + (S[j].Tnumb[3] - '0');
                    E2[en].Pamou++;
                    flag3 = 1;      //flag用来表示查询是否为空
                }
            }
            printf("Case %d: %d %d\n", i+1, type, data);
            if(flag3 == 0){
                printf("NA\n");
            }
            else{
                for(int k = N; k > 0; k--){
                    for(int j = 101; j < 1000; j++){
                        if(E2[j].Pamou == k){
                            printf("%d %d\n", j, k);
                        }
                    }
                }
            }
        }
    }
    return 0;
}

---END---

其它相关问题

PAT-B 1091 N-自守数(C语言)
PAT-B 1092 最好吃的月饼(C语言)
PAT-B 1093 字符串A+B(C语言)
PAT-B 1094 谷歌的招聘(C语言)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容