U E D R , A S I H C RSS

Contest Score Board/문보창

소감

{{| 2005/05/03 Accepted 0:00.000 64 |}}

마지막 테스트 과정에서 버그가 있어서 애를 먹었다.

코드

~cpp 
// no10258 - Contest Score Board
#include <iostream>
using namespace std;

#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))

const int NUMBER_TEAM = 101;
const int NUMBER_PROBLEM = 10;
const int TIME_PENALTY = 20;

typedef struct{
	int timeProblem[NUMBER_PROBLEM];
	int penalty;
	int numberSuccessProblem;
}ContestTeam;

void inputInfoContest(ContestTeam * team, bool * isSumit);
void initialize(ContestTeam * team, bool * isSumit);
void initializeTeam(ContestTeam * team);
void initializeIsSumit(bool * isSumit);
int settingRank(bool * isSumit, int * rankTeam);
void concludeRank(ContestTeam * team, int * rankTeam, int numberSumitTeam);
void printRank(ContestTeam * team, int * rankTeam, int numberSumitTeam);

int main()
{
	int numberCase;
	cin >> numberCase;
	cin.get();
	cin.get();

	ContestTeam team[NUMBER_TEAM];
	bool isSumit[NUMBER_TEAM];
	int rankTeam[NUMBER_TEAM];
	int numberSumitTeam;
	int i;
	for (i = 0; i < numberCase; i++)
	{
		initialize(team, isSumit);
		inputInfoContest(team, isSumit); 
		numberSumitTeam = settingRank(isSumit, rankTeam);
		concludeRank(team, rankTeam, numberSumitTeam);
		printRank(team, rankTeam, numberSumitTeam);
		if (i != numberCase - 1)
			cout << endl;
	}	
	return 0;
}

void initialize(ContestTeam * team, bool * isSumit)
{
	initializeTeam(team);
	initializeIsSumit(isSumit);
}

void initializeTeam(ContestTeam * team)
{
	for (int i = 1; i < NUMBER_TEAM; i++)
	{
		for (int j = 1; j < NUMBER_PROBLEM; j++)
			team[i].timeProblem[j] = 0;
		team[i].penalty = 0;
		team[i].numberSuccessProblem = 0;
	}
}

void initializeIsSumit(bool * isSumit)
{
	for (int i = 1; i < NUMBER_TEAM; i++)
		isSumit[i] = 0;
}

int settingRank(bool * isSumit, int * rankTeam)
{
	int count = 1;
	for (int i = 1; i < NUMBER_TEAM; i++)
	{
		if (isSumit[i] == true)
			rankTeam[count++] = i;
	}
	return count;
}

void inputInfoContest(ContestTeam * team, bool * isSumit)
{
	int numTeam, numProblem, time;
	char L;
	while (cin.peek() != EOF)
	{
		if (cin.peek() == '\n')
		{
			cin.get();
			break;
		}
		cin >> numTeam >> numProblem >> time >> L;
		isSumit[numTeam] = true;
		switch (L)
		{
		case 'C':
			if (team[numTeam].timeProblem[numProblem] == -1)
				break;
			team[numTeam].penalty += team[numTeam].timeProblem[numProblem] + time;
			team[numTeam].numberSuccessProblem++;
			team[numTeam].timeProblem[numProblem] = -1;	
			break;
		case 'I':
			if (team[numTeam].timeProblem[numProblem] == -1)
				break;
			team[numTeam].timeProblem[numProblem] += TIME_PENALTY;
			break;
		}
		cin.get();
	}
}

void concludeRank(ContestTeam * team, int * rankTeam, int numberSumitTeam)
{
	int top;
	int temp;
	for (int i = 1; i < numberSumitTeam; i++)
	{
		top = i;
		for (int j = i + 1; j < numberSumitTeam; j++)
		{
			if (team[rankTeam[top]].numberSuccessProblem < team[rankTeam[j]].numberSuccessProblem)
				SWAP(rankTeam[top], rankTeam[j], temp);
			else if (team[rankTeam[top]].numberSuccessProblem == team[rankTeam[j]].numberSuccessProblem)
			{
				if (team[rankTeam[top]].penalty > team[rankTeam[j]].penalty)
					SWAP(rankTeam[top], rankTeam[j], temp);
			}

		}
	}
}

void printRank(ContestTeam * team, int * rankTeam, int numberSumitTeam)
{
	for (int i = 1; i < numberSumitTeam; i++)
		cout << rankTeam[i] << " " << team[rankTeam[i]].numberSuccessProblem << " " << team[rankTeam[i]].penalty << endl;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.2053 sec