Programming Challenges 习题 2.8.7

PC/UVa:110207/10258

Contest Scoreboard

使用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
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值