Contents
  1. 1. 输入格式:
  2. 2. 输出格式:
  3. 3. 输入样例:
  4. 4. 输出样例:
  5. 5. 分析:

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{//case3中的考场和人数
string place;
int num=0;
}CASE3;
bool cmp1(Stu a,Stu b){//对case1中三种级别的考试名次进行排序
if (a.score != b.score) return a.score > b.score;
else return a.id < b.id;
}
bool cmp2(CASE3 a,CASE3 b){//对case3中的考场进行排序
if (a.num != b.num) return a.num > b.num;
else return a.place < b.place;
}
int main(){
//n是考试人数,m是查询次数,score是某学生考试分数,读入数据时使用
//type记录考试等级(0->顶级,1->甲级,2->乙级),case_id是查询id
//id是某学生id,读入时候使用,place_id记录某学生考场号,day是某学生考试日期
//op是读入case序号后的操作字符串
int n,m,score,type,case_id;
string id,place_id,day,op;
cin >> n >> m;
vector<Stu> stu(n);
//level_map[0]记录所有顶级学生信息,level_map[1]记录甲级顶级学生信息
//level_map[2]记录所有乙级学生信息
map<int,vector<Stu>> level_map;
//在case2中CASE2_stu_num_map记录中某考场学生人数
//在case2中CASE2_score_num_map记录某考场总分
map<string,int> CASE2_stu_num_map,CASE2_score_num_map;
//在case3中day_map[day]对应一个unorder_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);
//类型1
level_map[type].push_back(stu[i]);
//类型2
CASE2_stu_num_map[place_id] += 1;
CASE2_score_num_map[place_id] += stu[i].score;
//类型3
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;
//将需要查询的日期对应的表中的考场信息拿出来存入v中,对v进行排序
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;
}
Contents
  1. 1. 输入格式:
  2. 2. 输出格式:
  3. 3. 输入样例:
  4. 4. 输出样例:
  5. 5. 分析: