一个很简单的模拟
没啥细节。。基本上写得出就能过的那种。。。
我代码中的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; }