【详解!思路清晰】1095 解码PAT准考证 (25分)
立志用最少的代碼做最高效的表達
PAT乙級最優題解——>傳送門
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
解析
大碼量模擬題, 雖然很煎熬, 但滿分的那一刻, 什么都值了~
思路:
首先定義一個大結構體, 將輸入用sscanf分解后存入
指令一:定義一個vector數組, 元素類型是結構體。
這個結構體只存放準考證號和成績
將大結構體中符合條件的值導入, 最后自定義排序, 輸出即可。
指令2:直接遍歷大結構體,輸出即可。
指令三:類似指令一,
定義一個vector,元素類型是結構體
定義一個散列表map,用來保存考場號與學生人數的映射。
遍歷大結構體, 將映射建立起來。
將map中的值導入到結構體中。
對vector進行自定義排序。
輸出
代碼
#include<bits/stdc++.h> #define Max 10010 using namespace std;//總的大結構體 struct student{//準考證號、考場號(place)、日期號(date)、考生號(id),考試等級(level) char exam_id[20], p[10], d[10], id[10], l; int score; //分數}stu[Max];//指令1 結構體 struct order_1 {string exam_id; int score; }; //按等級輸出的優先級 bool order_1_cmp(order_1 s1, order_1 s2) {if(s1.score != s2.score) return s1.score > s2.score;else return s1.exam_id < s2.exam_id; }//指令3 結構體 struct order_3 {string p;int num; }; //指令3自定義優先級 bool order_3_cmp(order_3 s1, order_3 s2) {if(s1.num != s2.num) return s1.num > s2.num;else return s1.p < s2.p; }int main() {int num, cas; cin >> num >> cas;for(int i = 0; i < num; i++) {char s[50]; int score;cin >> stu[i].exam_id >> stu[i].score;sscanf(stu[i].exam_id, "%c%3s%6s%3s", &stu[i].l, stu[i].p, stu[i].d, stu[i].id);}for(int i = 1; i <= cas; i++) {int order; cin >> order;//指令1 if(order == 1) {char c; cin >> c; vector<order_1>v;for(int j = 0; j < num; j++) { //遍歷,找到條件符合的數存入結構體if(stu[j].l == c) {order_1 o1;o1.exam_id = stu[j].exam_id;o1.score = stu[j].score;v.push_back(o1);}}printf("Case %d: %d %c\n", i, order, c);//輸出 sort(v.begin(), v.end(), order_1_cmp);for(auto i : v) {cout << i.exam_id << ' ' << i.score << '\n';}if(v.empty()) cout << "NA\n"; }//指令2 else if(order == 2) {char c[10]; cin >> c;int num1 = 0, s_score = 0; //人數,總分 for(int j = 0; j < num; j++) { //遍歷結構體,找符合的數 if(strcmp(stu[j].p, c) == 0) {num1++; s_score += stu[j].score;}}//輸出 printf("Case %d: %d %s\n", i, order, c);if(num1 == 0) cout << "NA\n";else cout << num1 << ' ' << s_score << '\n';}//指令3 else if(order == 3) {char c[10]; cin >> c; //輸入日期 unordered_map<string, int>m3; //指令三、m2 for(int j = 0; j < num; j++) {if(!strcmp(stu[j].d, c)) {m3[stu[j].p]++; //教室與學生人數映射 }}//把map映射放入vector,然后排序,輸出。 vector<order_3>v;for(auto&um : m3) {order_3 o;o.p = um.first; o.num = um.second;v.push_back(o);}//輸出 printf("Case %d: %d %s\n", i, order, c);if(!v.empty()) { sort(v.begin(), v.end(), order_3_cmp);for(auto& i : v) cout << i.p << ' ' << i.num << '\n';}else cout << "NA\n";}}return 0; }耗時
每日一句
放棄不難,但堅持一定很酷。
總結
以上是生活随笔為你收集整理的【详解!思路清晰】1095 解码PAT准考证 (25分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于sscanf与结构体不能联用的问题
- 下一篇: 【最优解法】1030 完美数列 (25分