백준 25391 특별상

sirocube·2022년 8월 16일
0

BOJ

목록 보기
21/21

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

  • 그리디 알고리즘
  • 풀이
    어떤 상황이던 심판이 점수를 높게준 K 명의 학생은 수상을 한다는 사실을 알 수 있다. 따라서 심판이 점수를 높게준 K 명을 제외한 주최자가 점수를 높게 준 학생 M 명의 점수를 가장 높게 선정하면 수상하는 학생들의 점수 합을 최대로 얻을 수 있다.
    먼저 b 배열을 내림차순으로 정렬하고 앞에서부터 K 명의 점수를 얻는다. 그 후, a 배열을 내림차순으로 정렬하여 앞에서부터 M 명의 점수를 얻되, 이 인원은 이미 선정한 K 명중 포함되지 않아야 한다.
#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
const char en = '\n';
const int INF = (int)1e9 + 7;
const int mod = (int)1e9 + 7;

struct s {
	int a, b;
	bool c;
};

bool cmp_1(s x, s y) {
	if (x.a == y.a) return x.b > y.b;
	return x.a > y.a;
}

bool cmp_2(s x, s y) {
	if (x.b == y.b) return x.a > y.a;
	return x.b > y.b;
}


int main(void) {
	fast;

	int n, m, k; cin >> n >> m >> k;
	vector<s> v(n);
	for (int i = 0; i < n; ++i) {
		cin >> v[i].a >> v[i].b;
		v[i].c = false;
	}

	sort(v.begin(), v.end(), cmp_2);
	ll ans = 0;

	for (int i = 0; i < k; ++i) v[i].c = true;
	sort(v.begin(), v.end(), cmp_1);

	for (int i = 0; m; ++i) {
		if (!v[i].c) v[i].c = true, m--;
	}

	for (int i = 0; i < n; ++i) {
		if (v[i].c) ans += v[i].a;
	}

	cout << ans << en;
	return 0;
}
profile
잉차차

0개의 댓글