PAT(乙級)2018年春季考試
阿新 • • 發佈:2020-07-15
比賽連結:https://pintia.cn/market/item/1097414703086837760
A檢查密碼
Tips
密碼中可能有空格,所以需要用getline()。
程式碼
#include <bits/stdc++.h> using namespace std; void solve() { string s; getline(cin, s); bool ch = false, num = false, illegal = false; for (char c : s) { ch or_eq isalpha(c); num or_eq isdigit(c); illegal or_eq!(isalnum(c) or c == '.'); } if (s.size() < 6) cout << "Your password is tai duan le." << "\n"; else if (illegal) cout << "Your password is tai luan le." << "\n"; else if (ch and !num) cout << "Your password needs shu zi." << "\n"; else if (!ch and num) cout << "Your password needs zi mu." << "\n"; else cout << "Your password is wan mei." << "\n"; } int main() { int t; cin >> t; getchar(); while (t--) solve(); }
B射擊比賽
程式碼
#include <bits/stdc++.h> usingnamespace std; int main() { int n; cin >> n; double mi = DBL_MAX, mx = DBL_MIN; string win, lose; for (int i = 0; i < n; i++) { string s; int x, y; cin >> s >> x >> y; double len = sqrt(x * x + y * y); if (len < mi) mi = len, win = s; if (len > mx) mx = len, lose = s; } cout << win << ' ' << lose << "\n"; }
C是否存在相等的差
Tips
題目問的是否有重複的差值,所以只考慮出現次數 $>1$ 的差值。
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; map<int, int> mp; for (int i = 1; i <= n; i++) { int x; cin >> x; ++mp[abs(i - x)]; } for (auto it = mp.rbegin(); it != mp.rend(); it++) { if ((*it).second > 1) cout << (*it).first << ' ' << (*it).second << "\n"; } }
D外觀數列
題解
用雙指標計算每個字元連續出現的長度。
程式碼
#include <bits/stdc++.h> using namespace std; int main() { string s; int n; cin >> s >> n; map<int, string> mp; mp[1] = s; for (int i = 2; i <= n; i++) { string t; for (int j = 0; j < mp[i - 1].size(); ) { char c = mp[i - 1][j]; int len = 1; int k = j + 1; while (k < mp[i - 1].size() and mp[i - 1][k] == c) ++len, ++k; t += c + to_string(len); j = k; } mp[i] = t; } cout << mp[n] << "\n"; }
EPAT單位排行
Tips
同一學校的名字可能大小寫不同,這裡為了方便輸出可以同一標準化為小寫。另外,最好不要過載結構體的 $=$ 運算子,如果沒有過載全排序的過程中就可能會產生混亂。
程式碼
#include <bits/stdc++.h> using namespace std; struct Uni{ string name; int place, score, stu_num; int basic, advanced, top; }; int main() { int n; cin >> n; map<string, Uni> mp; for (int i = 0; i < n; i++) { string id, uni; int score; cin >> id >> score >> uni; for (char &c : uni) c = tolower(c); ++mp[uni].stu_num; if (id[0] == 'B') mp[uni].basic += score; if (id[0] == 'A') mp[uni].advanced += score; if (id[0] == 'T') mp[uni].top += score; mp[uni].name = uni; } int N = mp.size(); Uni a[N] = {}; int i = 0; for (auto uni : mp) { a[i] = uni.second; a[i].score = a[i].basic / 1.5 + a[i].advanced + a[i].top * 1.5; ++i; } sort(a, a + N, [] (Uni a, Uni b) { if (a.score != b.score) return a.score > b.score; else if (a.stu_num != b.stu_num) return a.stu_num < b.stu_num; else return a.name < b.name; }); a[0].place = 1; for (int i = 1; i < N; i++) { a[i].place = (a[i].score == a[i - 1].score ? a[i - 1].place : i + 1); } cout << N << "\n"; for (int i = 0; i < N; i++) { cout << a[i].place << ' ' << a[i].name << ' ' << a[i].score << ' ' << a[i].stu_num << "\n"; } }