1012 The Best Rank (25 分)
今天给大家分享的是PAT甲级的一道小题,设计题
简单翻译:
设计一个排名表,这个表中以学生ID为主键,C表示程序设计语言的成绩,M表示数学成绩,E表示英语成绩,A表示三门的平均成绩。
查询某些人的最好的排名是多少,输出这个排名,并输出是在哪门学科获得的这个排名。如果多个学科的最好排名是一样的,按照A C M E的优先级输出。
思路:
以不同的关键字分别进行排名,获得四个表,在这四个表中分别查询这个人的最好成绩即可。
小提示:
排名按照上学时候的成绩单的排名,即如果两个人得分相同,则那个名次并列,后面第一个不同的同学名次是前面的个数再 + 1。即如果两个人都考了100分,另一个人考了99分,则两个100分都是第一名,99分是第三名。
模拟出来实现即可。
C++代码:
#include"bits/stdc++.h"
#define all(x) x.begin(),x.end()
#define len(x) x.size()
#define INF (1e9)
#define vi vector<int>
#define ll long long int
#define ull unsigned long long int
#define db double
#define vvi vector<vector<int>>
#define pb(x) push_back(x);
using namespace std;
struct Node {
int s;
int C;
int M;
int E;
int A;
int Rank;
};
bool cmp1(struct Node a, struct Node b) {
return a.A > b.A;
}
bool cmp2(struct Node a, struct Node b) {
return a.C > b.C;
}
bool cmp3(struct Node a, struct Node b) {
return a.M > b.M;
}
bool cmp4(struct Node a, struct Node b) {
return a.E > b.E;
}
int main() {
int N, M;
cin >> N >> M;
vector<struct Node> a(N);
vector<struct Node> c(N);
vector<struct Node> d(N);
vector<struct Node> e(N);
for (int i = 0; i < N; i++) {
cin >> a[i].s >> a[i].C >> a[i].M >> a[i].E;
a[i].A = a[i].C + a[i].M + a[i].E;
c[i].A = a[i].A, c[i].C = a[i].C, c[i].M = a[i].M, c[i].E = a[i].E, c[i].s = a[i].s;
d[i].A = a[i].A, d[i].C = a[i].C, d[i].M = a[i].M, d[i].E = a[i].E, d[i].s = a[i].s;
e[i].A = a[i].A, e[i].C = a[i].C, e[i].M = a[i].M, e[i].E = a[i].E, e[i].s = a[i].s;
}
sort(all(a),cmp1);
a[0].Rank = 1;
for (int i = 1; i < N; i++) {
if (a[i].A == a[i - 1].A) {
a[i].Rank = a[i - 1].Rank;
} else {
a[i].Rank = i + 1;
}
}
sort(all(c),cmp2);
c[0].Rank = 1;
for (int i = 1; i < N; i++) {
if (c[i].C == c[i - 1].C) {
c[i].Rank = c[i - 1].Rank;
} else {
c[i].Rank = i + 1;
}
}
sort(all(d),cmp3);
d[0].Rank = 1;
for (int i = 1; i < N; i++) {
if (d[i].M == d[i - 1].M) {
d[i].Rank = d[i - 1].Rank;
} else {
d[i].Rank = i + 1;
}
}
sort(all(e),cmp4);
e[0].Rank = 1;
for (int i = 1; i < N; i++) {
if (e[i].E == e[i - 1].E) {
e[i].Rank = e[i - 1].Rank;
} else {
e[i].Rank = i + 1;
}
}
// cout << "a:------------------" << endl;
// for (int i = 0; i < N; i++) {
// cout << a[i].s << " " << a[i].A << " " << a[i].C << " " << a[i].M << " " << a[i].E << endl;
// }
// cout << "c:------------------" << endl;
// for (int i = 0; i < N; i++) {
// cout << c[i].s << " " << c[i].A << " " << c[i].C << " " << c[i].M << " " << c[i].E << endl;
// }
// cout << "d:------------------" << endl;
// for (int i = 0; i < N; i++) {
// cout << d[i].s << " " << d[i].A << " " << d[i].C << " " << d[i].M << " " << d[i].E << endl;
// }
// cout << "e:------------------" << endl;
// for (int i = 0; i < N; i++) {
// cout << e[i].s << " " << e[i].A << " " << e[i].C << " " << e[i].M << " " << e[i].E << endl;
// }
vector<int> b(M);
for (int i = 0; i < M; i++) {
cin >> b[i];
int bestRank = INF;
char bestType;
int j;
for (j = 0; j < N; j++) {
if (a[j].s == b[i]) {
if (a[j].Rank < bestRank) {
bestRank = a[j].Rank;
bestType = 'A';
break;
} else break;
}
}
if (j == N) {
cout << "N/A" << endl;
continue;
}
for (j = 0; j < N; j++) {
if (c[j].s == b[i]) {
if (c[j].Rank < bestRank) {
bestRank = c[j].Rank;
bestType = 'C';
break;
} else break;
}
}
for (j = 0; j < N; j++) {
if (d[j].s == b[i]) {
if (d[j].Rank < bestRank) {
bestRank = d[j].Rank;
bestType = 'M';
break;
} else break;
}
}
for (j = 0; j < N; j++) {
if (e[j].s == b[i]) {
if (e[j].Rank < bestRank) {
bestRank = e[j].Rank;
bestType = 'E';
break;
} else break;
}
}
cout << bestRank << " " << bestType << endl;
}
return 0;
}