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

 

1. 문제 이해

가방을 돌면서 보석의 우선순위에 따라 가격을 더해줌 !

주얼리는 무게가 작고, 가격이 쎈 순서대로 정렬해주고,

가방은 오름차순으로 정렬해주었다.

 

idx는 이미 더해준 값은 보지 않기 위한 인덱스이다.

pq는 무게가 작은 것 중 제일 쎈 가격이 나오도록 선언해주었다.

처음에는 else break;를 해주지 않아 300,000 * 300,000으로 시간초과가 났다

꼭 선언해주기 !

(힌트는 도움이 안됐다 .. 가방을 내림차순해야하는 줄 알았다ㅠ)  

 

2. 구현

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int n, k, m, v, c;
vector<pair<int, int>> jewel;
vector<int> bag;
long long result = 0;

bool cmp(pair<int, int> a, pair<int, int> b) {
    if (a.first == b.first) {
        return a.second > b.second;
    }
    return a.first < b.first;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> m >> v;
        jewel.emplace_back(m, v);
    }
    for (int i = 0; i < k; i++) {
        cin >> c;
        bag.push_back(c);
    }
    sort(jewel.begin(), jewel.end(), cmp);
    sort(bag.begin(), bag.end());

    int idx = 0;
    priority_queue<int> pq;

    for (int i = 0; i < k; i++) {
        int bag_size = bag[i];

        for (int j = idx; j < n; j++) {
            if (jewel[j].first <= bag_size) {
                pq.push(jewel[idx].second);
                idx++;
            } else {
                break; //중요
            }
        }
        if (!pq.empty()) {
            result += pq.top();
            pq.pop();
        }
    }
    cout << result;

    return 0;
}

'⚖️Algorithm' 카테고리의 다른 글

[java] 지식  (0) 2022.09.23
[백준 20056] 마법사 상어와 파이어볼  (0) 2022.08.28
[백준 17144] 미세먼지 안녕!  (0) 2022.08.16
[백준 14938] 서강그라운드  (0) 2022.08.15
[백준 2406] 안정적인 네트워크  (0) 2022.08.03

+ Recent posts