1137 Final Grading + 模拟 + 结构体排序(排名表)

排名表的题目是PAT里很多25分的题型。总体思路非常简单,就是模拟 + 排序.

PAT题目链接https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805345401028608

#include<iostream>
#include<unordered_map>
#include<algorithm>
#include<cstring>
using namespace std;

unordered_map<string, int> M;
struct person {
    string id;
    int score[4] = {-1, -1, -1, -1};
} P[30000];
int cnt;

bool cmp(struct person &a, struct person &b) {
    return (a.score[3] > b.score[3]) || (a.score[3] == b.score[3] && a.id < b.id);
}

int main() {
    int p, m, n;
    cin >> p >> m >> n;
    for (int i = 0; i < p; i++) {
        string id;
        int score;
        cin >> id >> score;
        if (M.find(id) == M.end()) {
            M[id] = ++cnt;
        }
        P[M[id]].id = id;
        P[M[id]].score[0] = score;
    }
    for (int i = 0; i < m; i++) {
        string id;
        int score;
        cin >> id >> score;
        if (M.find(id) == M.end()) {
            M[id] = ++cnt;
        }
        P[M[id]].id = id;
        P[M[id]].score[1] = score;
    }
    for (int i = 0; i < n; i++) {
        string id;
        int score;
        cin >> id >> score;
        if (M.find(id) == M.end()) {
            M[id] = ++cnt;
        }
        P[M[id]].id = id;
        P[M[id]].score[2] = score;
        // 开始计算最终的总分
        int mid_term = P[M[id]].score[1];
        int final_term = P[M[id]].score[2];
        if (mid_term > final_term) {
            P[M[id]].score[3] = (int)(mid_term * 0.4 + final_term * 0.6 + 0.5);
        } else {
            P[M[id]].score[3] = final_term;
        }
    }
    sort(P + 1, P + 1 + M.size(), cmp);
    for (int i = 1; i <= M.size(); i++) {
        if (P[i].score[0] < 200 || P[i].score[3] < 60) continue;
        cout << P[i].id;
        for (int j = 0; j < 4; j++) {
            printf(" %d", P[i].score[j]);
        }
        printf("\n");
    }
    return 0;
}
posted @ 2023-05-01 15:17  江韵阁  阅读(14)  评论(0)    收藏  举报