문제 링크: https://www.acmicpc.net/problem/5462

 

적당히 튜플이나 구조체 만들어서 정렬해주면 됩니다.

문제들이 초기에 점수가 N이라고 설정해놓고, 채점내역을 쭉 보면서 문제를 푼 사람이 생기면 1점씩 깝니다. 그럼 문제의 점수 계산이 완료됩니다

그 다음 채점내역을 한번 쭉 더 보면서 몇 문제 풀었는지, 점수는 몇점인지 계산합니다.

마지막으로 참가자 목록을 점수 내림차순, 푼 문제수 내림차순, ID 오름차순으로 정렬합니다. 이제 참가자 목록을 뒤져서 필립을 찾아 점수와 등수를 출력하면 끝입니다. 이 문제에서 등수는 공동 n등이 없기 때문에 참가자 목록에서 인덱스+1로 출력하면 됩니다.

#pragma GCC optimize ("Ofast")

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING

#include <bits/stdc++.h>
using namespace std;


int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	int n, t, p;	// 참가자, 문제, 필립ID
	cin >> n >> t >> p;

	vector<int> scores(t, n);
	vector<tuple<int, int, int>> participants(n); // 점수(-), 푼 문제수(-), id(+)
	vector<vector<int>> result(n, vector<int>(t));

	for (int i = 0; i < n; ++i) {
		auto& [score, solved, id] = participants[i];
		id = i + 1;

		for (int j = 0; j < t; ++j) {
			cin >> result[i][j];
			if (result[i][j]) {
				--scores[j];
				++solved;
			}
		}

		solved = -solved;
	}

	for (int i = 0; i < n; ++i) {
		auto& [score, solved, id] = participants[i];
		for (int j = 0; j < t; ++j) {
			if (result[i][j]) {
				score += scores[j];
			}
		}

		score = -score;
	}

	sort(participants.begin(), participants.end());

	for (int i = 0; i < n; ++i) {
		auto& [score, solved, id] = participants[i];
		if (id == p) {
			cout << -score << ' ' << i + 1 << '\n';
			break;
		}
	}


	return 0;
}
반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 10610: 30  (0) 2020.08.09
[백준][C++] 1049: 기타줄  (0) 2020.08.08
[백준][C++] 5462: POI  (0) 2020.08.07
[백준][C++] 5463: 건포도  (0) 2020.08.06
[백준][C++] 11051: 이항 계수 2  (0) 2020.08.05
[백준][C++] 11003: 최솟값 찾기  (0) 2020.08.04