※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5462번 문제인 POI이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5462
5462번: POI
1번 문제를 풀지 못한 사람은 1명, 2번 문제를 풀지 못한 사람은 2명, 3번 문제를 풀지 못한 사람은 4명이기 때문에, 각 문제의 점수는 1,2,4점이다. 이에 따라 1번 참가자는 4점을 획득하고, 2번 참가
www.acmicpc.net
각 참가자의 점수를 계산하려면 각 문제의 점수가 어떻게 결정되었는지를 먼저 알아내야 한다. 각 문제의 점수는 각 문제를 해결하지 못한 참가자 수와 같다는 문제 조건을 이용해 먼저 각 문제의 점수를 구하자. 그리고 구한 점수를 이용해 각 참가자의 점수를 구하자. 또한 각 참가자가 해결한 문제 수도 같이 구하자.
이제 각 참가자의 점수와 해결한 문제 수를 정렬 기준으로 세워 정렬하면 \(P\)번째 참가자(필립)의 순위를 구할 수 있다. 이를 구현해 문제를 해결하자.
순위는 0-based가 아닌 1-based값임에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, T, P;
int score[2001];
bool AC[2001][2001];
vector<pair<pair<int, int>, int>> vec;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> T >> P;
for (int t = 1; t <= T; t++) score[t] = N;
for (int i = 1; i <= N; i++) {
for (int t = 1; t <= T; t++) {
cin >> AC[i][t];
if (AC[i][t]) score[t]--;
}
}
for (int i = 1; i <= N; i++) {
int val = 0, cnt = 0;
for (int t = 1; t <= T; t++) {
if (AC[i][t]) val += score[t], cnt++;
}
vec.emplace_back(make_pair(make_pair(-val, -cnt), i));
}
sort(vec.begin(), vec.end());
for (int i = 0; i < N; i++) {
if (vec[i].second == P) cout << -vec[i].first.first << ' ' << i + 1;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14905 // C++] 소수 4개의 합 (0) | 2024.03.20 |
---|---|
[BOJ 11692 // C++] 시그마 함수 (3) | 2024.03.19 |
[BOJ 17254 // C++] 키보드 이벤트 (2) | 2024.03.17 |
[BOJ 1680 // C++] 쓰레기 수거 (0) | 2024.03.16 |
[BOJ 17423 // C++] 민원이 넘쳐흘러 (0) | 2024.03.15 |