PAT 甲级 1012 The Best Rank 模拟

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

 

上一篇:乙级PAT真题1012


下一篇:CSS3 flex布局属性整理