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; 이런식 선언으로 해봤다.