https://www.acmicpc.net/problem/23246
2021 icpc 인터넷 예선 I번 문제이다.
선수의 등번호는 고유의 번호(key)이고 각 선수의 점수(value)에 따라 정렬해서 등번호를 출력해야 되기 때문에 stl map을 사용하였다.
문제는 두 선수의 곱한 점수가 같을 때를 고려해야 되는데 이 때, 합산 점수와 곱한 점수가 둘 다 필요하므로 map value 값으로 pair문으로 선언하였다.
C++ stl map은 value 값 기준으로 정렬이 따로 제공되지 않아 map의 요소들을 vector로 옮겨서 정렬해야한다. 그 다음 stl sort를 사용해서 3번째 인자로 comp함수를 문제의 조건에 맞게 작성하면 어렵지 않게 풀 수 있다.
#include<bits/stdc++.h>
using namespace std;
int n;
map<int, pair<int, int>> m;
static bool comp(pair<int, pair<int, int>>& a, pair<int, pair<int, int>>& b) {
if (a.second.first == b.second.first) {
if (a.second.second == b.second.second) {
return a.first < b.first;
}
else {
return a.second.second < b.second.second;
}
}
return a.second.first < b.second.first;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int b, p, q, r;
cin >> b >> p >> q >> r;
m.insert({ b, {p * q * r, p + q + r} });
}
vector<pair<int, pair<int, int>>> v(m.begin(), m.end());
sort(v.begin(), v.end(), comp);
for (int i = 0; i < 3; i++) {
cout << v[i].first << " ";
}
}