題目來源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}); }