PC/UVa:110207/10258
使用vvCrtPenalty
统计C的罚时,使用vvIcrtPenalty
统计I的罚时,初始值全部为0(或者-1,不过这道题好像不存在时间为0的提交时间)。统计C的罚时时,如果这道题的罚时为0,表明是第一次C,将提交时间作为罚时;统计I的罚时时,如果这道题还没有C,则累加罚时。
罚时统计完毕后,对于所有参赛的队伍(也就是提交过一次的队伍),如果vvCrtPenalty
不为0,则解决的题目数加1,同时计算该题目的总体罚时。
所有的<队伍, 解题数,罚时>统计完毕后,根据要求排序即可。
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
typedef struct Commit
{
int iTeam;
int iProblem;
int iTime;
char chState;
}Commit;
typedef struct Rank
{
int iTeam;
int iSolved;
int iTime;
}Rank;
bool operator<(const Rank &r1, const Rank &r2)
{
if (r1.iSolved < r2.iSolved) return true;
else if (r1.iSolved > r2.iSolved) return false;
else{
if (r1.iTime > r2.iTime) return true;
else if (r1.iTime < r2.iTime) return false;
else{
if (r1.iTeam > r2.iTeam) return true;
else return false;
}
}
}
int main()
{
int n = 0;
cin >> n;
cin.get();
cin.get();
for (int t = 0; t < n; t++)
{
vector<Commit> vecCom;
Commit commit;
string strLine;
while (getline(cin, strLine)){
if (strLine.empty()) break;
istringstream iss(strLine);
iss >> commit.iTeam >> commit.iProblem >> commit.iTime >> commit.chState;
vecCom.push_back(commit);
}
//计算每个队伍的解题数目
vector<bool> vvb(100, false);
vector<vector<int>> vvCrtPenalty(100, vector<int>(9, 0)), vvIcrtPenalty(100, vector<int>(9, 0));
for (size_t i = 0; i < vecCom.size(); i++)
{
vvb[vecCom[i].iTeam - 1] = true;//该队伍参赛
if (vecCom[i].chState == 'C'){//第一次正确提交计算罚时
if (vvCrtPenalty[vecCom[i].iTeam - 1][vecCom[i].iProblem - 1] == 0){
vvCrtPenalty[vecCom[i].iTeam - 1][vecCom[i].iProblem - 1] = vecCom[i].iTime;
}
}
else if (vecCom[i].chState == 'I'){//错误提交没有解决的问题的罚时
if (vvCrtPenalty[vecCom[i].iTeam - 1][vecCom[i].iProblem - 1] == 0){
vvIcrtPenalty[vecCom[i].iTeam - 1][vecCom[i].iProblem - 1] += 20;
}
}
}
vector<Rank> vr;
Rank rank;
for (size_t i = 0; i < 100; i++)
{
if (vvb[i]){
rank.iTeam = i + 1;
rank.iSolved = 0;
rank.iTime = 0;
for (size_t j = 0; j < 9; j++)
{
if (vvCrtPenalty[i][j] != 0){
rank.iSolved++;
rank.iTime += vvCrtPenalty[i][j] + vvIcrtPenalty[i][j];
}
}
vr.push_back(rank);
}
}
sort(vr.begin(), vr.end());
for (size_t i = vr.size(); i > 0; i--)
{
cout << vr[i - 1].iTeam << ' ' << vr[i - 1].iSolved << ' ' << vr[i - 1].iTime << endl;
}
if (t != n - 1) cout << endl;
}
return 0;
}
/*
1
1 2 10 I
3 1 11 C
1 2 19 R
1 2 21 C
1 1 25 C
*/