PAT B1095 解码PAT准考证

Posted codewars

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT B1095 解码PAT准考证相关的知识,希望对你有一定的参考价值。

  半个月了,每天做几道题PAT基础题,终于把基础的95道题目做完了。总体来说,没有太难的东西,偶尔几个题目有点复杂而已。

  加油,离3月份的考试越来越近了,还有155道题目等着我呢!!!

 

B_1095题目如下:

1095 解码PAT准考证 (25 分)

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



思路:根据要求输出的三个指令,选择数据的存储方式。
  指令1:1.可以通过map容器存储,map<string,vector<studata> >
    键值string为(‘A‘、‘B‘、‘T‘) studata数据类型存储学生准考证号和成绩
      2.也可以直接通过三个vector存储   
               vector<studata> levelTStu;
                vector<studata> levelAStu;
                vector<studata> levelBStu;
  指令2:可直接用两个数组存储,examRoomCnt[1000] = {0},examRoomResult[1000] = {0}
      分别存储考场人数和考场总成绩。(也可用map容器)
  指令3:用双重unordered_map图存储,相对map来说,查询速度比较块。
    unordered_map<int, unordered_map<int, examroom> > dateExamData;
    第一个int为六位数的日期,也可以用string类型;
    第二个int为考场号,统计相应考场学生人数时使用;
    examroom存储考场号和考场人数。
这样存储后,输出就很简单了,只需要按照要求进行一定的排序后,就可以直接输出。

代码如下:
  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <vector>
  4 #include <unordered_map>
  5 #include <string>
  6 #include <stdlib.h>
  7 #include <string.h>
  8 #include <algorithm>
  9 using namespace std;
 10 /*
 11 1.Level --> id/score sort
 12     solve:vector + struct -> sort -> output
 13 2.ExamRoom --> peopleCnt/scoreSum
 14     solve:Array + int -> plus
 15 3.Date --> ExamRoom/people + sort
 16     solve:map + int + vector
 17 */
 18 typedef struct STUDATA
 19 {
 20     char id[13];
 21     int result;
 22 }studata;
 23 typedef struct EXAMROOMID
 24 {
 25     int id;
 26     int cnt=0;
 27 }examroom;
 28 bool CmpStuData(studata a, studata b)
 29 {
 30     if(a.result != b.result)
 31     {
 32         return a.result > b.result;
 33     }
 34     else if(a.id != b.id)
 35     {
 36         return strcmp(a.id, b.id) < 0;
 37     }
 38     return false;
 39 }
 40 bool CmpExamRoom(examroom a, examroom b)
 41 {
 42     if(a.cnt != b.cnt)
 43     {
 44         return a.cnt > b.cnt;
 45     }
 46     else if(a.id != b.id)
 47     {
 48         return a.id < b.id;
 49     }
 50     return false;
 51 }
 52 int main()
 53 {
 54     //指令1数据存储
 55     vector<studata> levelTStu;
 56     vector<studata> levelAStu;
 57     vector<studata> levelBStu;
 58     //指令2数据存储
 59     int N,M,examRoomCnt[1000] = {0},examRoomResult[1000] = {0};
 60     //指令3数据存储
 61     unordered_map<int, unordered_map<int, examroom> > dateExamData;
 62 
 63     studata tempStuData;
 64     examroom tempExamroom;
 65     char examRoomId[5] = {0};
 66     char examDateStr[7] = {0};
 67 
 68     scanf("%d %d", &N, &M);
 69     //数据读入
 70     while(N--)
 71     {
 72         scanf("%s",tempStuData.id);
 73         scanf("%d", &tempStuData.result);
 74         //指令1
 75         if(tempStuData.id[0] == A)
 76         {
 77             levelAStu.push_back(tempStuData);
 78         }
 79         else if(tempStuData.id[0] == B)
 80         {
 81             levelBStu.push_back(tempStuData);
 82         }
 83         else
 84         {
 85             levelTStu.push_back(tempStuData);
 86         }
 87         //指令2
 88         strncpy(examRoomId, tempStuData.id + 1, 3);
 89         int examRoom = atoi(examRoomId);
 90         ++ examRoomCnt[examRoom];
 91         examRoomResult[examRoom] += tempStuData.result;
 92         //指令3
 93         strncpy(examDateStr, tempStuData.id + 4, 6);
 94         int examDate = atoi(examDateStr);
 95         dateExamData[examDate][examRoom].id = examRoom;
 96         ++ dateExamData[examDate][examRoom].cnt;
 97     }
 98    // cout << "Data entered over" << endl;
 99     int tempCmd;
100     char cmdStr[7] = {0};
101     int cmdCnt = 0;
102     //指令读入
103     while(M--)
104     {
105         memset(cmdStr,0,sizeof(cmdStr));
106         scanf("%d %s", &tempCmd, cmdStr);
107         ++ cmdCnt;
108         printf("Case %d: %d %s
", cmdCnt, tempCmd, cmdStr);
109         bool outputFlag = false;
110         if(tempCmd == 1)
111         {
112             if(cmdStr[0] == A)
113             {
114                 sort(levelAStu.begin(), levelAStu.end(), CmpStuData);
115                 for(int i = 0; i < levelAStu.size(); ++ i)
116                 {
117                     outputFlag = true;
118                     printf("%s %d
", levelAStu[i].id, levelAStu[i].result);
119                 }
120             }
121             else if(cmdStr[0] == T)
122             {
123                 sort(levelTStu.begin(), levelTStu.end(), CmpStuData);
124                 for(int i = 0; i < levelTStu.size(); ++ i)
125                 {
126                     outputFlag = true;
127                     printf("%s %d
", levelTStu[i].id, levelTStu[i].result);
128                 }
129             }
130             else
131             {
132                 sort(levelBStu.begin(), levelBStu.end(), CmpStuData);
133                 for(int i = 0; i < levelBStu.size(); ++ i)
134                 {
135                     outputFlag = true;
136                     printf("%s %d
", levelBStu[i].id, levelBStu[i].result);
137                 }
138             }
139         }
140         else if(tempCmd == 2)
141         {
142             strncpy(examRoomId,cmdStr,3);
143             int examRoom = atoi(examRoomId);
144             if(examRoomCnt[examRoom] > 0)
145             {
146                 outputFlag = true;
147                 printf("%d %d
", examRoomCnt[examRoom], examRoomResult[examRoom]);
148             }
149         }
150         else if(tempCmd == 3)
151         {
152             strncpy(examDateStr,cmdStr,6);
153             int examDate = atoi(examDateStr);
154             unordered_map<int, examroom> tempDateExamData = dateExamData[examDate];
155             examroom tempExamroomArray[tempDateExamData.size()];
156             if(tempDateExamData.size() > 0)
157             {
158                 outputFlag = true;
159                 int i = -1;
160                 for(auto it = tempDateExamData.begin(); it != tempDateExamData.end(); ++ it)
161                 {
162                     tempExamroomArray[++i] = it->second;
163                 }
164                 sort(tempExamroomArray, tempExamroomArray+tempDateExamData.size(), CmpExamRoom);
165                 for(i = 0; i < tempDateExamData.size(); ++ i)
166                 {
167                     printf("%d %d
", tempExamroomArray[i].id, tempExamroomArray[i].cnt);
168                 }
169             }
170         }
171         if(!outputFlag)
172         {
173             printf("NA
");
174         }
175     }
176     return 0;
177 }

 




















以上是关于PAT B1095 解码PAT准考证的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1095 解码PAT准考证 (25 分)

PAT Basic 1095 解码PAT准考证 (25 分)

PTA乙级 (*1095 解码PAT准考证 (25分))

1095 解码PAT准考证

乙级 1095 解码PAT准考证

乙级 1095 解码PAT准考证