Problem
Problem URL : 보석 도둑
Explain Logic
큰 가방은 작은 가방이 넣을 수 있는 보석을
모두 넣을 수 있다.
그렇기 때문에
작은 가방에 들어갈 수 있는
가능한 보석의 Value를 Priority Queue에 넣고
그 중 Root에 있는걸 pop 한다.
(= Max Value pop)
여기서 핵심이
그 다음 가방은 현재 가방이 담을 수 있는 보석들을 담을 수 있기 때문에
현재 가방에 대한 위의 과정 + 현재 Priority Queue의 값들 중에서
Root를 pop한다.
이 말이 이해가 안간다며 Code를 참고하자.
Priority Queue가 유지되기 때문에
무게로 sort를 하지만
무게는 더 무겁지만 가치가 작은값은
어차피 Priority Queue는 Value를 기준으로 정렬을 하기 때문에
최적의 해가 구해진다.
이 말이 이해가 안간다면 Code를 참고하자.
[1] Answer Code (18. 02. 20)
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int> p;
vector<p> v;
vector<int> b; // b is bag
int main(){
int n,k;
cin >> n >> k;
for(int i=1; i<=n; i++){
int a,b;
scanf("%d %d",&a, &b);
v.push_back({a,b});
}
for(int i=1; i<=k; i++){
int a;
scanf("%d",&a);
b.push_back(a);
}
sort(v.begin(),v.end());
sort(b.begin(), b.end());
priority_queue<int> q;
long long sum = 0;
// i : Bag index -- k
// j : Jewelry index -- n
for(int i=0,j=0; i<k; i++){
while ( j<n && v[j].first <= b[i]) {
q.push(v[j++].second);
}
if(! q.empty()){
sum += q.top();
q.pop();
}
}
cout << sum << endl;
return 0;
}
Code Review
[1] Answer Code (18. 02. 20)
-
알고리즘이 생각나지 않아 답을 참고하였다.
-
아이디어 심플하고 굉장히 좋다.
-
typedef pair<int, int> p; 이런식 선언으로 해봤다.