티스토리 뷰

백준

백준 소스코드 [C++] 1202 보석 도둑

Hani_Levenshtein 2021. 7. 8. 11:56

https://www.acmicpc.net/problem/1202

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

백준 소스코드 [C++] 1202 보석 도둑

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <deque>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string.h>
#include <set>
#include <map>
#include <unordered_map>
#include <sstream>
#include <cstdlib>
#include <cassert>
#define all(v) v.begin(), v.end()
#define pii pair<int, int>
#define pli pair<ll, int>
#define make_unique(v) sort(all(v)), v.erase(unique(all(v)), v.end())
typedef long long ll;
using namespace std;


struct thing {
    int weight,price;
    bool operator<(const thing& R) const {
        return weight < R.weight;
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n,m,a,b;
    ll res=0;
    cin>>n>>m;
    vector<thing> things;
    vector<int> bag(m);
    priority_queue<int> pq;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        thing x; x.weight=a; x.price=b;
        things.push_back(x);
    }
    sort(all(things));
    for(int i=0;i<m;i++) cin>>bag[i];
    sort(all(bag));
    
    for(int i=0,j=0;i<m;i++){
        while(j<n && things[j].weight <= bag[i]) pq.push(things[j++].price);
        if(!pq.empty()){
            res+=pq.top();
            pq.pop();
        }
    }
    cout<<res<<'\n';
    
    return 0;
}
댓글