Level: Level 2
풀이: 기존풀이 참고
Language: C++
문제설명
세계적인 도둑 상덕이는 보석점을 털기로 결심했다.
상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.
입력/출력
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)
다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)
다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)
모든 숫자는 양의 정수이다.
입력 예
3 2 1 65 5 23 2 99 10 2
출력
첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.
출력 예
164
힌트 ⇒ 첫 번째 보석을 두 번째 가방에, 세 번째 보석을 첫 번째 가방에 넣으면 된다.
풀이
가격이 높은 보석도 중요하지만, 그 보석 무게 이상인 값 중에서 가장 작은 값을 갖는 가방을 선택해야 가격이 높은 보석을 많이 훔칠 수 있다.
우선순위 큐를 이용하여 문제를 해결하였다.
Code
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int N, K;
int bag[300000];
pair<int, int> jew[300000];
priority_queue<int> q; //우선순위 큐 사용
int main(void){
//보석의 개수 N, 가방의 개수 K
cin >> N >> K;
//N개 만큼 보석의 정보 입력 받음
for (int i = 0; i < N; i++)
cin >> jew[i].first >> jew[i].second;
//K개 만큼 가방의 최대 무게 입력 받음
for (int i = 0; i < K; i++)
cin >> bag[i];
//무게를 기준으로 보석과 가방 오름차순 정렬
sort(jew, jew + N);
sort(bag, bag + K);
long long result = 0;
int idx = 0;
//무게제한이 낮은 가방부터 최대한 비싼 보석을 넣는 방법
for (int i = 0; i < K; i++)
{
//i번째 가방의 무게제한에 충족하는 보석 다 넣음
while (idx < N && jew[idx].first <= bag[i])
q.push(jew[idx++].second);
//q 가장 처음에는 현재 기준 제일 비싼 보석이 들어있음
if (!q.empty()) {
result += q.top();
q.pop();
}
}
cout << result << "\n";
}
ScreenShot
참고
https://jaimemin.tistory.com/760
'Programming > Programming 풀이' 카테고리의 다른 글
[Algorithm] BFS(너비우선탐색)와 DFS(깊이우선탐색) (296) | 2021.01.12 |
---|---|
[Baekjoon] 2401번 최대 문자열 붙여넣기(C++) (306) | 2021.01.11 |
[Baekjoon] 10828번 스택(C언어) (285) | 2021.01.07 |
[Baekjoon] 11279번 최대 힙(C++) (476) | 2021.01.07 |
[Algorithm] 문자열 재정렬 (C++) (719) | 2020.10.17 |