본문 바로가기
Algorithm/BOJ

BOJ 2019 - 순회강연(Greedy)

by Ellery 2021. 4. 12.

www.acmicpc.net/problem/2109

 

2109번: 순회강연

한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.

www.acmicpc.net

- 짧게 걸리면서 페이가 높은 순으로 강연을 해야 가장 높은 수익을 올릴 수 있다. 현재 소요기간을 카운트하기 위해서 우선순위 큐를 이용해서 시행한 강연만 페이에 대한 최대힙에 남도록 로직을 구현했다. 

#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int n, ans;
vector<pair<int, int>> a;
priority_queue<int> pq;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n;
    for (int i = 0; i < n; ++i) {
        int pay, day;
        cin >> pay >> day;
        a.push_back({day, -pay});
    }
    sort(a.begin(), a.end());  // day 오름차순, pay 내림차순

    for (int i = 0; i < n; ++i) {
        ans -= a[i].second;
        pq.push(a[i].second);

        if (a[i].first >= pq.size()) continue;  // pq.size()는 현재 소요기간
        ans += pq.top();
        pq.pop();
    }

    cout << ans;
    return 0;
}