1. 程式人生 > 實用技巧 >PAT(乙級)2018年春季考試

PAT(乙級)2018年春季考試

比賽連結: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>
using
namespace 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";
    }
}