πŸ™‡β€β™€οΈ[Gold II] 보석 도둑 - 1202

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 8740 KB, μ‹œκ°„: 156 ms

λΆ„λ₯˜

자료 ꡬ쑰, 그리디 μ•Œκ³ λ¦¬μ¦˜, μš°μ„ μˆœμœ„ 큐, μ •λ ¬

제좜 일자

2024λ…„ 3μ›” 12일 12:17:20

문제 μ„€λͺ…

세계적인 도둑 μƒλ•μ΄λŠ” 보석점을 ν„ΈκΈ°λ‘œ κ²°μ‹¬ν–ˆλ‹€.

상덕이가 ν„Έ λ³΄μ„μ μ—λŠ” 보석이 총 N개 μžˆλ‹€. 각 보석은 무게 Mi와 가격 Viλ₯Ό 가지고 μžˆλ‹€. μƒλ•μ΄λŠ” 가방을 K개 가지고 있고, 각 가방에 담을 수 μžˆλŠ” μ΅œλŒ€ λ¬΄κ²ŒλŠ” Ci이닀. κ°€λ°©μ—λŠ” μ΅œλŒ€ ν•œ 개의 λ³΄μ„λ§Œ 넣을 수 μžˆλ‹€.

상덕이가 ν›”μΉ  수 μžˆλŠ” λ³΄μ„μ˜ μ΅œλŒ€ 가격을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 Nκ³Ό Kκ°€ 주어진닀. (1 ≀ N, K ≀ 300,000)

λ‹€μŒ N개 μ€„μ—λŠ” 각 λ³΄μ„μ˜ 정보 Mi와 Viκ°€ 주어진닀. (0 ≀ Mi, Vi ≀ 1,000,000)

λ‹€μŒ K개 μ€„μ—λŠ” 가방에 담을 수 μžˆλŠ” μ΅œλŒ€ 무게 Ciκ°€ 주어진닀. (1 ≀ Ci ≀ 100,000,000)

λͺ¨λ“  μˆ«μžλŠ” μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 상덕이가 ν›”μΉ  수 μžˆλŠ” 보석 κ°€κ²©μ˜ ν•©μ˜ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

μš°μ„ μˆœμœ„ 큐λ₯Ό μ‘μš©ν•œ λ¬Έμ œμ΄λ‹€.

int n, k;
const int MAX = 300010;
pair<int, int> jewerly[MAX];
int bag[MAX];
priority_queue<int, vector<int>, less<int>> q;

void solve()
{
    cin >> n >> k;
    for (int i = 0; i < n; ++i)
    {
        cin >> jewerly[i].first >> jewerly[i].second;
    }
    for (int i = 0; i < k; ++i)
    {
        cin >> bag[i];
    }

    sort(jewerly, jewerly + n);
    sort(bag, bag + k);

    int idx = 0;
    long long ret = 0;

    for (int i = 0; i < k; ++i)
    {
        // q에 κ°€λ°©μ˜ λ¬΄κ²Œκ°€ λœλ‹€λ©΄ λ‹€ 집어 λ„£κΈ°
        while (idx < n && bag[i] >= jewerly[idx].first)
        {
            q.push(jewerly[idx].second);
            idx++;
        }
        // κ·Έ 쀑 κ°€μž₯ λΉ„μ‹Όκ±°λ₯Ό 가방에 λ„£κΈ°
        // κ°€λ°© ν•˜λ‚˜ λ‹Ή ν•˜λ‚˜μ˜ 보석이 λ“€μ–΄κ°„λ‹€.
        if (q.empty() == false)
        {
            ret += q.top();
            q.pop();
        }
    }

    cout << ret;
}

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>

using namespace std;

int n, k;
const int MAX = 300010;
pair<int, int> jewerly[MAX];
int bag[MAX];
priority_queue<int, vector<int>, less<int>> q;

void solve()
{
    cin >> n >> k;
    for (int i = 0; i < n; ++i)
    {
        cin >> jewerly[i].first >> jewerly[i].second;
    }
    for (int i = 0; i < k; ++i)
    {
        cin >> bag[i];
    }

    sort(jewerly, jewerly + n);
    sort(bag, bag + k);

    int idx = 0;
    long long ret = 0;

    for (int i = 0; i < k; ++i)
    {
        while (idx < n && bag[i] >= jewerly[idx].first)
        {
            q.push(jewerly[idx].second);
            idx++;
        }
        if (q.empty() == false)
        {
            ret += q.top();
            q.pop();
        }
    }

    cout << ret;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    freopen("input.txt", "rt", stdin);

    solve();

    return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: