PAT A1012 The Best Rank
思路:根据四种成绩进行四次排序,使用 Rank 数组保存这四种排序中最小的数字作为查询结果。注意该相同分数时排名相同。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 2005;
typedef struct {
int id;
int grade[4];
} Student;
Student stu[MAXN];
int Rank[1000000][4], now;
char mp[4] = {'A', 'C', 'M', 'E'};
int N, M;
bool cmp(Student a, Student b) {
return a.grade[now] > b.grade[now];
}
int main() {
cin >> N >> M;
for(int i = 0; i < N; i++) {
cin >> stu[i].id >> stu[i].grade[1] >> stu[i].grade[2] >> stu[i].grade[3];
stu[i].grade[0] = stu[i].grade[1] + stu[i].grade[2] +stu[i].grade[3];
}
for(now = 0; now < 4; now++) {
sort(stu, stu + N, cmp);
Rank[stu[0].id][now] = 1;
for(int i = 1; i < N; i++) {
if(stu[i].grade[now] == stu[i - 1].grade[now]) {
Rank[stu[i].id][now] = Rank[stu[i - 1].id][now];
} else {
Rank[stu[i].id][now] = i + 1;
}
}
}
int q;
for(int i = 0; i < M; i++) {
cin >> q;
if(Rank[q][0] == 0) {
cout << "N/A\n";
} else {
int k = 0;
for(int j = 0; j < 4; j++) {
if(Rank[q][j] < Rank[q][k]) {
k = j;
}
}
cout << Rank[q][k] << " " << mp[k] << endl;
}
}
return 0;
}