地址 https://pintia.cn/problem-sets/994805342720868352/problems/994805502658068480
主要是模拟 题意比较绕。 题目大意是 接受各个学生的三门成绩 C M E, 然后四舍五入计算出平均成绩A 在 接受询问的学生的id后 打印出该学生排名最佳的学科名次和学习名字 如果多门学科名次相同 则按照 ACME的次序排序考虑 For example, The grades of C, M, E and A - Average of 4 students are given as the following: StudentID C M E A 310101 98 85 88 90 310102 70 95 88 84 310103 82 87 94 88 310104 91 91 91 91 Sample Input: 5 6 310101 98 85 88 310102 70 95 88 310103 82 87 94 310104 91 91 91 310105 85 90 90 310101 310102 310103 310104 310105 999999 Sample Output: 1 C 1 M 1 E 1 A 3 A N/A
解答
这里有个暗坑需要注意的是 如果某学科的成绩排序如下 100 99 99 99 85 那么该科目成绩99的三个学生都是排名第二 成绩85的学生排名第五 所以最好使用数组来记录成绩排序(允许有重复) 然后查询某个成绩的排名使用遍历找到第一个符合的分数的位置就是排名 或者使用二分查找第一个符合分数的位置作为排名
#include <iostream> #include <map> #include <vector> #include <cmath> #include <algorithm> #include <string> using namespace std; const int N = 2010; map<string, vector<int>> mm; vector<int> mA; vector<int> mC; vector<int> mM; vector<int> mE; int n, m; int GetIdxA(int x) { for (int i = 0; i < mA.size(); i++) { if (x == mA[i]) return i + 1; } return 0; } int GetIdxC(int x) { for (int i = 0; i < mC.size(); i++) { if (x == mC[i]) return i + 1; } return 0; } int GetIdxM(int x) { for (int i = 0; i < mM.size(); i++) { if (x == mM[i]) return i + 1; } return 0; } int GetIdxE(int x) { for (int i = 0; i < mE.size(); i++) { if (x == mE[i]) return i + 1; } return 0; } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { string id; int C, M, E; cin >> id >> C >> M >> E; int A = round((C + M + E) / 3.0); mm[id].push_back(A); mm[id].push_back(C); mm[id].push_back(M); mm[id].push_back(E); mA.push_back(A); mC.push_back(C); mM.push_back(M); mE.push_back(E); } sort(mA.begin(), mA.end(),greater<int>()); sort(mC.begin(), mC.end(), greater<int>()); sort(mM.begin(), mM.end(), greater<int>()); sort(mE.begin(), mE.end(), greater<int>()); for (int i = 0; i < m; i++) { string id; cin >> id; if (mm.count(id) == 0) { cout << "N/A" << endl; continue; } int ans = 999999; char type = 'A'; int idx = GetIdxA(mm[id][0]); if (ans > idx) { ans = idx; type = 'A'; } idx = GetIdxC(mm[id][1]); if (ans > idx) { ans = idx; type = 'C'; } idx = GetIdxM(mm[id][2]); if (ans > idx) { ans = idx; type = 'M'; } idx = GetIdxE(mm[id][3]); if (ans > idx) { ans = idx; type = 'E'; } cout << ans << " " << type << endl; } return 0; }