[BOJ/C++] 3758 KCPC

Hanbi·2024년 2월 13일
0

Problem Solving

목록 보기
95/108
post-thumbnail

문제

https://www.acmicpc.net/problem/3758

풀이

문제를 정리하면

  • 총점은 높을수록
  • 총점 같으면, 제출 횟수 적을수록
  • 총점 & 제출 횟수 같으면, 제출 시간 빠를수록

(총점, 제출 횟수, 제출 시간, id) vector를 만들고, sorting 해주면 된다.
단, 제출 횟수 & 제출 시간은 작을수록 높은 우선순위이므로 - 붙여서 vector에 넣으면 함수로 쉽게 정렬 됨

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int T;
	cin >> T;
	while (T--) {
		int n, k, t, m;
		cin >> n >> k >> t >> m;
		int arr[101][101] = { 0 };
		int cnt[101] = { 0 };
		int order[101] = { 0 };
		t--;
		for (int i = 0; i < m; i++) {
			int id, num, s;
			cin >> id >> num >> s;
			id--;
			num--;
			arr[id][num] = max(arr[id][num], s);
			cnt[id]++;
			order[id] = i;
		}


		vector < pair<int, pair<int, pair<int, int>>>> v; //총점, 제출횟수, 최종제출시간, 팀번호
		for (int i = 0; i < n; i++) {
			int sum = 0;
			for (int j = 0; j < k; j++)
				sum += arr[i][j];
			v.push_back({ sum,{-cnt[i],{-order[i],i}} });
		}
		sort(v.begin(), v.end());
		for (int i = 0; i < n; i++) {
			if (v[i].second.second.second == t) cout << n-i << '\n';
		}
	}

	return 0;
}
profile
👩🏻‍💻

0개의 댓글