题目


解法1

点击查看代码
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;

struct Student {
    string id;
    int c, m, e, a;
};

bool cmpA(const Student &s1, const Student &s2) {
    return s1.a > s2.a;
}

bool cmpC(const Student &s1, const Student &s2) {
    return s1.c > s2.c;
}

bool cmpM(const Student &s1, const Student &s2) {
    return s1.m > s2.m;
}

bool cmpE(const Student &s1, const Student &s2) {
    return s1.e > s2.e;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<Student> students(n);
    unordered_map<string, int> idToIndex;

    for (int i = 0; i < n; i++) {
        cin >> students[i].id >> students[i].c >> students[i].m >> students[i].e;
        students[i].a = (students[i].c + students[i].m + students[i].e) / 3;
        idToIndex[students[i].id] = i;
    }

    vector<Student> sortedByA = students;
    vector<Student> sortedByC = students;
    vector<Student> sortedByM = students;
    vector<Student> sortedByE = students;

    sort(sortedByA.begin(), sortedByA.end(), cmpA);
    sort(sortedByC.begin(), sortedByC.end(), cmpC);
    sort(sortedByM.begin(), sortedByM.end(), cmpM);
    sort(sortedByE.begin(), sortedByE.end(), cmpE);

    for (int i = 0; i < m; i++) {
        string id;
        cin >> id;
        if (idToIndex.find(id) == idToIndex.end()) {
            cout << "N/A" << endl;
            continue;
        }

        int index = idToIndex[id];
        int rankA = 1, rankC = 1, rankM = 1, rankE = 1;

        for (int j = 0; j < n; j++) {
            if (sortedByA[j].a > students[index].a) rankA++;
            if (sortedByC[j].c > students[index].c) rankC++;
            if (sortedByM[j].m > students[index].m) rankM++;
            if (sortedByE[j].e > students[index].e) rankE++;
        }

        if (rankA <= rankC && rankA <= rankM && rankA <= rankE) {
            cout << rankA << " A" << endl;
        } else if (rankC <= rankA && rankC <= rankM && rankC <= rankE) {
            cout << rankC << " C" << endl;
        } else if (rankM <= rankA && rankM <= rankC && rankM <= rankE) {
            cout << rankM << " M" << endl;
        } else {
            cout << rankE << " E" << endl;
        }
    }

    return 0;
}