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

浙公网安备 33010602011771号