-
[2109] 순회강연BOJ 2022. 2. 12. 21:58
https://www.acmicpc.net/problem/2109
2109번: 순회강연
한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.
www.acmicpc.net
<문제>
i일에 진행되는 강연을 갈지를 판별해야 한다고 보면, [1, i]일에 진행되는 모든 강연을 큐에 넣는다.
큐의 size()가 i보다 크다면, size를 i로 맞추기 위해서 가장 싼 강연부터 빼준다.
로직은 매우 간단하고 직관적인데 구현방식에 대한 고민이 필요하다.
2중 loop로 구현하면 간단하겠지만, 그 경우 강연 선택 여부에대한 bool []이 추가적으로 필요할 수 있겠다.
입력받은걸 하나씩 넣는다면, 큐의 size()가 i+1 이하에 있으므로 while이 아닌 if로 구현이 가능하다.
<소스코드>
#include <bits/stdc++.h>using namespace std;using pi = pair<int, int>;int n, ans;vector<pi> v;priority_queue<int, vector<int>, greater<int>> q;int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n;v.resize(n);int i;for (i = 0; i < n; i++) cin >> v[i].second >> v[i].first;sort(v.begin(), v.end());for (i = 0; i < n; i++) ans += v[i].second;for (i = 0; i < n; i++) {q.push(v[i].second);if (q.size() > v[i].first) {ans -= q.top();q.pop();}}cout << ans;return 0;}'BOJ' 카테고리의 다른 글
[12034] 김인천씨의 식료품가게 (Large) (0) 2022.02.12 [2012] 등수 매기기 (0) 2022.02.12 [1941] 소문난 칠공주 (0) 2022.02.12 [13023] ABCDE (0) 2022.02.11 [16929] Two Dots (0) 2022.02.11