重复代码很多的一道模拟题,感觉写得不够好。
坑点就是,可能会忘记分数相等时,排名是并列的,取高。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3+3;
const double EPS = 1e-6;
char course[4] = {'A', 'C', 'M', 'E'};
struct Student {string id;double mark[4];int bestRank;char bestCourse;Student() {bestRank = maxn;}void getInfo() {cin >> id >> mark[1] >> mark[2] >> mark[3];}void getAve() {mark[0] = (mark[1] + mark[2] + mark[3]) / 3.0;}
} students[maxn];
int n, m;void read() {cin >> n >> m;for (int i = 1; i <= n; ++i) {students[i].getInfo();students[i].getAve();}
}bool cmpA(const Student& s1, const Student& s2) {return s1.mark[0] - s2.mark[0] > EPS;
}bool cmpC(const Student& s1, const Student& s2) {return s1.mark[1] - s2.mark[1] > EPS;
}bool cmpM(const Student& s1, const Student& s2) {return s1.mark[2] - s2.mark[2] > EPS;
}bool cmpE(const Student& s1, const Student& s2) {return s1.mark[3] - s2.mark[3] > EPS;
}void getBestRank(int c) {int high = maxn;for (int i = 1; i <= n; ++i) {// 分数有可能相同,排名并列;考虑到精度,直接用==就行(逃if (students[i-1].mark[c] == students[i].mark[c]) {high = min(high, i-1);} else {high = i;}if (students[i].bestRank >= high) {students[i].bestRank = high;students[i].bestCourse = course[c];}}
}void solve() {sort(students+1, students+1+n, cmpE);getBestRank(3);sort(students+1, students+1+n, cmpM);getBestRank(2);sort(students+1, students+1+n, cmpC);getBestRank(1);sort(students+1, students+1+n, cmpA);getBestRank(0);string id;while (m--) {cin >> id;bool isExist = false;for (int i = 1; i <= n; ++i) {if (students[i].id == id) {cout << students[i].bestRank << " " << students[i].bestCourse << endl;isExist = true;break;}}if (!isExist) {cout << "N/A" << endl;}}
}int main() {read();solve();return 0;
}