题目来源java
PAT 准考证号由 4 部分组成:ios
T
表明顶级;A
表明甲级;B
表明乙级;现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各类统计信息。c++
输入首先在一行中给出两个正整数 N(≤104)和 M(≤100),分别为考生人数和统计要求的个数。数组
接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。spa
考生信息以后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令
,其中code
类型
为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令
则给出表明指定级别的字母;类型
为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令
则给出指定考场的编号;类型
为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令
则给出指定日期,格式与准考证上日期相同。对每项统计要求,首先在一行中输出 Case #: 要求
,其中 #
是该项要求的编号,从 1 开始;要求
即复制输入给出的要求。随后输出相应的统计结果:排序
类型
为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩
。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);类型
为 2 的指令,按 人数 总分
的格式输出;类型
为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数
。若人数并列则按考场编号递增顺序输出。若是查询结果为空,则输出 NA
。ci
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
给出一组学生的信息字符串
T
、A
、B
要求根据指令进行查询get
1
:给出等级T、A、B
,查找该等级的考生
2
:给出考场ID,输出这个考场的考生数量和总分
3
:给出日期,输出在相同日期的考场ID,人数
结构体student记录考生的id,分数score
结构体site记录考场的siteId,考生人数cnt
查询1
查询2
考生id.substr(1,3)
得到考生的考场ID查询3
用unordered_map<string, int> m
记录每一个考场的人数
遍历全部考生,用考生id.substr(4,6)
得到考试的日期
找到和输入的日期 相同的 考试日期
考生.id.substr(1,3)
得到考场IDunordered_map
,记录出现的次数:m[考场ID]++
遍历unordered_map
,将{first, second}
做为一个site
结构体,放入res
数组
res.push_back({first, second})
res
数组进行排序
遍历数组输出
#include <iostream> #include <vector> #include <algorithm> #include <unordered_map> #include <unordered_set> #include <string> #include <stack> #include <cmath> #include <map> using namespace std; // 考生的信息 typedef struct student { string id; int score; }; // 记录考场的ID和考场的人数 typedef struct site { string siteId; int cnt; }; // 查询1的排序 // 成绩降序、准考证升序排序 bool cmp(const student& a, const student& b) { if (a.score != b.score) { return a.score > b.score; } else { return a.id < b.id; } } // 查询3的排序 // 人数降序,考场编号升序排序 bool cmp2(const site& a, const site& b) { if (a.cnt != b.cnt) { return a.cnt > b.cnt; } else { return a.siteId < b.siteId; } } int main() { int N, M; cin >> N >> M; // 全部考生信息 vector<student> stus(N); for (int i = 0; i < N; ++i) { cin >> stus[i].id >> stus[i].score; } for (int j = 1; j <= M; ++j) { int num; cin >> num; if (num == 1) { string level; cin >> level; printf("Case %d: %d %s\n", j, num, level.c_str()); // 存放level等级的考生信息 vector<student> res; for (int i = 0; i < N; ++i) { // 和level同样等级的考生,push进去 if (level[0] == stus[i].id[0]) { res.push_back(stus[i]); } } sort(res.begin(), res.end(), cmp); for (int i = 0; i < res.size(); ++i) { printf("%s %d\n", res[i].id.c_str(), res[i].score); } if (res.size() == 0) { printf("NA\n"); } } else if (num == 2) { int sum = 0; string siteId; cin >> siteId; printf("Case %d: %d %s\n", j, num, siteId.c_str()); vector<student> res; for (int i = 0; i < N; ++i) { if (stus[i].id.substr(1, 3) == siteId) { res.push_back(stus[i]); sum += stus[i].score; } } if (res.empty()) { printf("NA\n"); } else { printf("%d %d\n", res.size(), sum); } } else { string date; cin >> date; printf("Case %d: %d %s\n", j, num, date.c_str()); vector<site> res; // 存放考场 unordered_map<string, int> m; // 考场出现的次数 for (int i = 0; i < N; ++i) { if (stus[i].id.substr(4, 6) == date) { string siteId = stus[i].id.substr(1, 3); m[siteId]++; } } for (auto& i : m) { res.push_back({ i.first, i.second }); } sort(res.begin(), res.end(), cmp2); for (int i = 0; i < res.size(); ++i) { printf("%s %d\n", res[i].siteId.c_str(), res[i].cnt); } if (res.empty()) { printf("NA\n"); } } } return 0; }
// TODO
string
类型字符串,用c_str()
后,能够用%s
输出
string str = "abc"; printf("%s", str.c_str());
map
的key-value
能够用一个{key, value}
放进一个结构图
typedef struct s{ string str; int cnt; }; unordered_map<string, int> m; m["abc"] = 1; vector<s> res; // 存放考场 for(auto& i: m){ res.push_back({i.first, i.second}); }