문제 링크: 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++] 5463: 건포도 (0) | 2020.08.06 |
[백준][C++] 11051: 이항 계수 2 (0) | 2020.08.05 |
[백준][C++] 11003: 최솟값 찾기 (0) | 2020.08.04 |