📕알고리즘 문제/📝Baekjoon

[백준] 골드2 : (1781) 컵라면

주으기 2024. 11. 12. 15:53
728x90
반응형

문제: https://www.acmicpc.net/problem/1781

 

최대 데드라인을 초과하지 않는 범위에서 가장 많은 컵라면을 얻는 문제이다.

 

ex)

7
1 9
1 100
2 300
2 99
3 100
5 100
5 999

 

다음 예시에서, Day1에서는 1~5 데드라인의 문제를 모두 풀 수 있다.

그리고, Day5에서는 5 데드라인의 문제만이 풀 수 있다.

 

따라서, 이 문제는 마지막 날부터 역순으로 계산하는 것이 핵심인 문제이다.

 

데드라인을 하나씩 줄여가며, 각 날짜에 풀 수 있는 문제들을 우선순위 큐에 넣는다.

(우선순위 큐는 그러면 계속 풀 수 있는 문제 후보군들이 남아있다)

각 날마다 우선순위 큐 안에서 보상이 가장 큰 문제를 선택하여 정답에 더하고, 큐에서 뺀다.

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

ll N, DeadLine, Answer;
priority_queue<ll> pq;

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

	cin >> N;

	vector<pair<ll, ll>> Problem(N); // { 데드라인, 컵라면 수 }

	for (ll i = 0; i < N; ++i)
	{
		cin >> Problem[i].first >> Problem[i].second;
		DeadLine = max(DeadLine, Problem[i].first);
	}

	// 문제들을 데드라인 순으로 오름차순, 보상 순으로 내림차순 정렬
	sort(Problem.begin(), Problem.end());

	int CurrentDay = DeadLine;	// 마지막 날짜부터 시작
	int Index = N - 1;			// 마지막 문제부터 처리

	// 마지막 날부터 첫날까지 순차적으로 처리
	while (CurrentDay > 0)
	{
		// 현재 날에 처리 가능한 문제들을 큐에 넣기
		while (Index >= 0 && Problem[Index].first >= CurrentDay)
		{
			pq.push(Problem[Index].second);
			Index--;
		}

		// 큐에서 보상이 가장 큰 문제를 꺼내서 처리
		if (!pq.empty())
		{
			Answer += pq.top();
			pq.pop();
		}
		CurrentDay--;
	}
	cout << Answer << "\n";
}

 

 

 

 

 

728x90
반응형