一个很简单的模拟
没啥细节。。基本上写得出就能过的那种。。。
我代码中的CE数组没啥用,最开始写的时候以为要用就写了,后来也没删

一点代码上的细节:

排序的时候用的lambda表达式,不熟悉的也可以用其他方法来实现
lambda表达式是c++11的特性,一般作为一种临时函数来使用,像在这里只会在排序的时候调用,而写成全局函数又会显得很累赘,所以可以直接嵌套lambda表达式,简单来说(可能不严谨),格式为:

[全局变量](函数参数) {
函数体
return 返回值
}

而STL种的sort函数参数为:sort(起点,终点,比较函数(可省略参数)),所以在比较函数处应用了lambda表达式

int rank[m];
for(int i = 0; i < m; ++i)
    rank[i] = i;
sort(rank, rank + m, [n](int a, int b) {
    if(AC[a][n] > AC[b][n]) return 1;
    if(AC[b][n] > AC[a][n]) return 0;
    if(teamTime[a] < teamTime[b]) return 1;
    if(teamTime[b] < teamTime[a]) return 0;
    return (int)(mp2[a] < mp2[b]);
});

还有就是计算排名时,成绩相同会并列排名
这里采用的是应用一个rk变量记录上一个人的排名,每次输出时判断当前成绩是否跟上一个人相同,若不同则更新rk,否则rk保持不变

#include<bits/stdc++.h>
using namespace std;

const int maxn = 15;
const int maxm = 55;

map<string, int> mp;
map<int, string> mp2;
int AC[maxm][maxn]; //AC[i][j]表示第i队第j题的AC情况
int WA[maxm][maxn]; //WA[i][j]表示第i队第j题的WA情况
int CE[maxm][maxn]; //CE[i][j]表示第i队第j题的CE情况
int teamTime[maxm];

int main() {
    int T; cin>>T;
    while(T--) {
        mp.clear();
        memset(AC, 0, sizeof(AC));
        memset(WA, 0, sizeof(WA));
        memset(CE, 0, sizeof(CE));
        memset(teamTime, 0, sizeof(teamTime));

        int n, m; cin>>n>>m;
        for(int i = 0; i < m; ++i) {
            string team; cin>>team;
            mp[team] = i;
            mp2[i] = team;
        }

        int q; cin>>q;
        while(q--) {
            string team;
            int _teamTime;
            char qId;
            string result;
            cin>>team>>_teamTime>>qId>>result;

            int teamId = mp[team];

            //已经AC
            if(AC[teamId][qId - 'A'])
                continue;

            if(result == "Accepted") {
                AC[teamId][qId - 'A'] = _teamTime;
                ++AC[teamId][n];
            }
            else if(result == "Compilation-Error") {
                ++CE[teamId][qId - 'A'];
            }
            else {
                ++WA[teamId][qId - 'A'];
            }
        }

        for(int i = 0; i < m; ++i) {
            teamTime[i] = 0;
            for(int j = 0; j < n; ++j) {
                if(!AC[i][j]) continue;
                teamTime[i] += AC[i][j] + WA[i][j] * 20;
            }
        }

        int rank[m];
        for(int i = 0; i < m; ++i)
            rank[i] = i;
        sort(rank, rank + m, [n](int a, int b) {
            if(AC[a][n] > AC[b][n]) return 1;
            if(AC[b][n] > AC[a][n]) return 0;
            if(teamTime[a] < teamTime[b]) return 1;
            if(teamTime[b] < teamTime[a]) return 0;
            return (int)(mp2[a] < mp2[b]);
        });

        int rk = 1;
        for(int i = 0; i < m; ++i) {
            int id = rank[i];
            if(i == 0 || AC[id][n] < AC[rank[i-1]][n] || teamTime[id] > teamTime[rank[i-1]])
                rk = i+1;
            cout<<rk<<" "<<mp2[id]<<" "<<AC[id][n]<<" "<<teamTime[id]<<" ";
            for(int j = 0; j < n; ++j) {
                if(AC[id][j])
                    cout << "+" << (1 + WA[id][j]) << "(" << AC[id][j] << ") ";
                else
                    cout << "-" << WA[id][j] << " ";
            }
            cout<<endl;
        }

        if(T) cout<<endl;
    }
    return 0;
}