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准考证的主要内容,如果未能解决你的问题,请参考以下文章