PS

BOJ 1202 - 보석 도둑

728x90

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

 

이 문제는 백준 1781 컵라면 (www.acmicpc.net/problem/1781) 문제와 코드 구조가 거의 비슷하다.

그리디와 우선순위 큐를 이용해서 풀어야 하는 문제 유형이다.

 

이 문제를 보고, 보석 가격이 비싼 순서대로 정렬하고, 가방이 무게 제한이 낮은 순으로 정렬해서 하나하나 비교해도 되지 않나라고 생각할 수 있지만, N 과 K 의 최대값이 30만 이므로 무조건 시간초과가 나게 된다.

 

이 문제를 풀기위해서는 먼저, 보석의 정보가 가치와 무게로 주어지고, 가방이 각각 담을 수 있는 무게가 주어지는데,

둘다(보석과 가방) 무게를 기준으로 오름 차순 정렬해준다. 

 

가방의 무게가 제일 덜 나가는거 부터 시작해서 k 번 순회하는데

이때 i 번째 가방의 무게 안으로 들어오는 보석들은 최대힙에 넣어서 정렬한다. (기본 우선순위 큐)

그리고 나서 가장 큰 보석 가치를 가지는 (pq.top()) 값만 빼내서 정답에 더한다

 

이때 정답이 int 범위를 넘어갈 수 도 있기에 long long 타입으로 선언한다.

 

 

- c++

#include <bits/stdc++.h>
 
using namespace std;
 
int N, K;
vector<pair<intint>> gem; // 무게, 가치 
vector<int> backpack;
 
bool comp(pair<intint>& p1, pair<intint>& p2) {
    return p1.first < p2.first;
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> N >> K;
    
    for (int i = 0; i < N; ++i) {
        int m, v;
        cin >> m >> v;
        gem.push_back({m, v});
    }
    
    for (int i = 0; i < K; ++i) {
        int c;
        cin >> c;
        backpack.push_back(c);
    }
    
    sort(gem.begin(), gem.end(), comp); // 보석 무게 오름차순 
    sort(backpack.begin(), backpack.end()); // 가방 무게 오름차순 
    
    priority_queue<int> pq;
    
    int idx = 0;
    long long answer = 0// 30만* 백만 이 최대가 될 수 있음
     
    for (int i = 0; i < K; ++i) {
        while(idx < N && backpack[i] >= gem[idx].first) {
            pq.push(gem[idx].second); // 보석 가치를 넣어서 최대힙 정렬 
            idx++;
        }
        
        if (!pq.empty()) {
            answer += (long long)pq.top(); // 최대 가치를 가진 보석만 추출 
            pq.pop();
        } 
    }
    
    cout << answer;
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 1450 - 냅색문제  (0) 2021.02.20
BOJ 1826 - 연료 채우기  (0) 2021.02.20
BOJ 5557 - 1학년  (0) 2021.02.14
BOJ 2228 - 구간 나누기  (0) 2021.02.14
BOJ 2212 - 센서  (0) 2021.02.14