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";
}

E - PAT单位排行

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(), i = 0;
    Uni a[N] = {};
    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";
    }
}

PAT乙级就先做到这里吧...

整体来说题目难度不是很大,基本上都是模拟题,不过写一些题时需要注意考虑特殊情况。

posted @ 2020-07-15 13:00  Kanoon  阅读(274)  评论(0)    收藏  举报