안녕하세요.

여행벌입니다.

오늘은 ACM-ICPC 2013 예선전 문제인 'KCPC' 풀이를 해보겠습니다.

단순 구현 문제로 문제 조건들만 잘 읽어준다면, 쉽게 풀 수 있습니다.


[문제해석]

1 ~ N 개의 팀이 있고, 1 ~ M 개의 문제가 있다고 하자.

문제마다 얻을 수 있는 점수는 0 ~ 100점이고, 팀 최종 점수는 모든 문제에서 획득한 점수의 합이라고 하자.

만약에 팀 최종 점수가 같다면 제출 횟수가 적은 팀이, 최종 점수와 제출 횟수고 같다면 마지막 제출이 더 빠른 팀이 이기고 동시에 서로 다른 팀이 문제를 제출하는 경우는 없다고 하자.

이때, 내가 속한 팀은 몇 등인지 출력하라.

 

[알고리즘설계]

Problem_Score[x][y] : x팀의 y번 문제에 대한 최대 점수.

total_socre[x] : x팀의 최종 점수.

count[x] : x팀의 문제 제출 횟수.

time[x] : x팀의 마지막 제출 시간.

위와 같은 배열을 4개 선언해주고 문제 해석에 맞춰서 구현을 진행하면 된다.

#include<iostream>

using namespace std;

int main(void){
	ios::sync_with_stdio(false);
	cin.tie(0);

	//freopen("input2.txt", "r", stdin);
	int test_case;
	cin >> test_case;
	for(int i = 0; i < test_case; i++){
		int nteams, nproblems, myid, nlog;
		cin >> nteams >> nproblems >> myid >> nlog;
		
		int team_problem[101][101]={};
		int count[101]={};
		int time[101]={};
		int total_score[101]={};

		for(int j = 1;j <= nlog; j++){
			int x,y,z;
			cin >> x >> y >> z;
			if (team_problem[x][y] < z)
				team_problem[x][y] = z;
			count[x]++;
			time[x] = j;
		}

		for (int j = 1; j <= nteams; j++){
			for (int k = 1; k <= nproblems; k++){
				total_score[j] += team_problem[j][k];
			}
		}

		int rank = 1;

		for (int j = 1; j <= nteams; j++){
			if(j == myid)
				continue;
			if(total_score[j] > total_score[myid])
				rank++;
			if(total_score[j] == total_score[myid]){
				if(count[j] < count[myid])
					rank++;
				if(count[j] == count[myid]){
					if(time[j] < time[myid])
						rank++;
				}
			}
		}
		cout << rank << '\n';

	}
}

열심히 공부하고 노력하고 있는 꿈 많은 예비 개발자입니다.
혼자서 공부한 내용을 정리하고 포스팅하다 보니 틀린 내용이 있을 수도 있습니다.
많은 조언과 가르침 주실 분은 댓글로 자유롭게 남겨주셔도 좋을 것 같습니다! 
감사합니다.

'Problem Solving > ICPC' 카테고리의 다른 글

[ACM-ICPC][BOJ] 10251 - Driving License  (0) 2019.08.27
[ACM-ICPC][BOJ] 9019 - DSLR  (0) 2019.08.16
[ACM-ICPC][BOJ] 7287 - Registration  (0) 2019.08.08
[ACM-ICPC][BOJ] 9011 - Order  (0) 2019.08.08
[ACM-ICPC][BOJ] 9012 - Parenthesis  (0) 2019.08.08

+ Recent posts