PAT 准考证号由 4 部分组成:
- 第 1 位是级别,即
T
代表顶级;A
代表甲级;B
代表乙级;
- 第 2~4 位是考场编号,范围从 101 到 999;
- 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
- 最后 11~13 位是考生编号,范围从 000 到 999。
现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。
输入格式:
输入首先在一行中给出两个正整数 N(≤104)和 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
分析:
先分别说下三种类型分别如何实现:
①case1。定义Stu存储结构存储某学生的考试编号和成绩,用map<int,vector> level_map存储各个等级的学生信息。level_map[0]记录所有顶级学生信息,level_map[1]记录甲级顶级学生信息,level_map[2]记录所有乙级学生信息。然后用cmp1分别对其排序即可。
②case2。在case2中CASE2_stu_num_map记录中某考场学生人数,在case2中CASE2_score_num_map记录某考场总分。输入的时候记录下信息就可以了。
③case3。可以用map<string,unordered_map<string,int>> day_map来记录。键是日期,值是一个unorder_map。该unorder_map中包含该日所有考场信息。例如day_map[“180908”]对应包含18年9月8日所有的考场信息unorder_map。day_map[“180908”][“107”]记录18年9月8日107号考场的人数。在最后输出的时候,将其中的信息都存入动态数组v中进行排序再输入即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include<iostream> #include<vector> #include<map> #include<algorithm> #include<unordered_map> using namespace std; typedef struct { string id; int score=0; }Stu; typedef struct{ string place; int num=0; }CASE3; bool cmp1(Stu a,Stu b){ if (a.score != b.score) return a.score > b.score; else return a.id < b.id; } bool cmp2(CASE3 a,CASE3 b){ if (a.num != b.num) return a.num > b.num; else return a.place < b.place; } int main(){ int n,m,score,type,case_id; string id,place_id,day,op; cin >> n >> m; vector<Stu> stu(n); map<int,vector<Stu>> level_map; map<string,int> CASE2_stu_num_map,CASE2_score_num_map; map<string,unordered_map<string,int>> day_map; for (int i=0;i<n;i++){ cin >> stu[i].id >> stu[i].score; if (stu[i].id[0] == 'T') type = 0; else if (stu[i].id[0] == 'A') type = 1; else if (stu[i].id[0] == 'B') type = 2; place_id = stu[i].id.substr(1,3); day = stu[i].id.substr(4,6); level_map[type].push_back(stu[i]); CASE2_stu_num_map[place_id] += 1; CASE2_score_num_map[place_id] += stu[i].score; day_map[day][place_id]++; } for (int i=0;i<3;i++) sort(level_map[i].begin(),level_map[i].end(),cmp1); for (int k=0;k<m;k++){ cin >> case_id >> op; cout << "Case "<< k+1 << ": " << case_id << " " << op << endl; if (case_id == 1){ int flag = 0; if (op == "T") type = 0; else if (op == "A") type = 1; else if (op == "B") type = 2; else flag = 1; if (level_map[type].size()==0) flag = 1; for (int i=0;i<level_map[type].size();i++) cout << level_map[type][i].id << " " << level_map[type][i].score <<endl;; if (flag) cout << "NA" << endl; } else if (case_id == 2){ if (CASE2_stu_num_map[op] == 0) cout << "NA" << endl; else cout << CASE2_stu_num_map[op] << " " << CASE2_score_num_map[op] << endl; } else if (case_id == 3){ if (day_map[op].size() == 0) cout << "NA" << endl; else { vector<CASE3> v; CASE3 T; for (auto it:day_map[op]){ T.place = it.first; T.num = it.second; v.push_back(T); } sort(v.begin(),v.end(),cmp2); for (int i=0;i<v.size();i++) cout << v[i].place << " " << v[i].num << endl; } } else cout << "NA" << endl; } return 0; }
|