※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13904번 문제인 과제이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13904
13904번: 과제
예제에서 다섯 번째, 네 번째, 두 번째, 첫 번째, 일곱 번째 과제 순으로 수행하고, 세 번째, 여섯 번째 과제를 포기하면 185점을 얻을 수 있다.
www.acmicpc.net
greedy 알고리즘 문제이다.
과제를 수행하는 날짜를 뒷날짜부터 살펴보며, 그날 수행할 수 있는 가장 점수가 높은 과제를 수행하는 것이 최적이 된다. 증명은 귀류법으로 간단히 할 수 있다.
우선순위 큐(priority queue)를 이용하면 현재 날짜에 수행할 수 있는 가장 점수가 높은 과제가 무엇인지를 쉽게 관리할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
queue<int> que[1001];
priority_queue<int> pq;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int ans = 0;
int N; cin >> N;
while (N--) {
int d, w; cin >> d >> w;
que[d].push(w);
}
for (int i = 1000; i > 0; i--) {
while (!que[i].empty()) {
pq.push(que[i].front());
que[i].pop();
}
if (!pq.empty()) {
ans += pq.top();
pq.pop();
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2661 // C++] 좋은수열 (0) | 2021.09.18 |
---|---|
[BOJ 14891 // C++] 톱니바퀴 (0) | 2021.09.17 |
[BOJ 3109 // C++] 빵집 (0) | 2021.09.15 |
[BOJ 19598 // C++] 최소 회의실 개수 (0) | 2021.09.14 |
[BOJ 14419 // C++] Foehn Phenomena (0) | 2021.09.13 |