https://www.acmicpc.net/problem/3758
문제조건
- 총 k개의 문제
- 풀이를 제출한 팀의 ID, 문제 번호, 점수가 서버의 로그에 제출되는 시간 순서대로 저장
- 한 문제에 대해 여러번 제출한다면 가장 높은 점수가 그 문제의 최종점수
(좋은데,,?) - 최종 점수가 같은 경우
- 풀이를 제출한 횟수가 적은 팀의 순위가 높다.
- 제출 횟수도 같은 경우
- 마지막 제출 시간이 더 빠른 팀의 순위가 높다.
- 우리 팀의 순위는?
접근방법
딱히 접근방법이라할게 없었다. 문제의 조건이 까다로운 만큼 문제에서 요구하는 그대로 구현만 잘 해주면 되는 문제였다. 그리고 나는 따로 구조체를 만들고 그에 맞게 정렬을 해주었다.
소스코드
#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 101
using namespace std;
int T;
struct info {
int score;
int num;
int time;
int teamNum;
};
bool cmp(info a, info b) {
if (a.score == b.score) {
if (a.num == b.num) return a.time < b.time;
return a.num < b.num;
}
return a.score > b.score;
}
int main() {
cin >> T;
while (T--) {
int n, k, t, m;
cin >> n >> k >> t >> m;
int team[MAX][MAX] = { 0 };
int cnt[MAX] = { 0 };
int order[MAX] = { 0 };
vector<info> v;
for (int log = 0; log < m; log++) {
int i, j, s;
cin >> i >> j >> s;
if (team[i][j] < s) team[i][j] = s;
cnt[i]++;
order[i] = log;
}
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= k; j++) sum += team[i][j];
v.push_back({ sum, cnt[i], order[i], i });
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < n; i++)
if (v[i].teamNum == t) cout << i + 1 << '\n';
}
}
구현의 정석(?) 같은 느낌의문제였다.
'Algorithm > 구현, 시뮬레이션' 카테고리의 다른 글
[BAEKJOON] 14719번 빗물 (0) | 2024.05.21 |
---|---|
[BAEKJOON] 15685번 드래곤 커브 (1) | 2024.04.10 |
[BAEKJOON] 13458번 시험 감독 (0) | 2024.04.06 |
[BAEKJOON] 3190번 뱀 (0) | 2024.04.06 |
[BAEKJOON] 13460번 구슬 탈출 2 (0) | 2024.04.05 |