※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts