티스토리 뷰

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

 

풀이

보석이 N개, 가방이 K개 있습니다. 각 가방은 담을 수 있는 최대 무게가 정해져있고, 하나의 보석만을 담을 수 있습니다.

 

그리디하게 생각합시다. 최대 무게가 작은 가방부터 보며 그때 담을 수 있는 최대 가치의 보석을 털면 됩니다.

증명은 BOJ 채점기가 해주겠죠??

자세한 구현은 코드를 참고해주세요.

 

정답 코드

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define ft first
#define sd second
#define all(x) (x).begin(), (x).end()
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vb = vector<bool>;
using vs = vector<string>;
using vd = vector<double>;
using vll = vector<ll>;
using vpii = vector<pii>;
using vvi = vector<vi>;
using vvb = vector<vb>;
using vvll = vector<vll>;
using vvpii = vector<vpii>;

int n, k;
pii p[333'333];
int bag[333'333];

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

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> p[i].ft >> p[i].sd;
    }
    for (int i = 0; i < k; i++) {
        cin >> bag[i];
    }
    p[n] = {INF, 0};
    n++;
    sort(bag, bag + k);
    sort(p, p + n);
    int idx = 0;
    priority_queue<int> q;
    ll ans = 0;
    for (int i = 0; i < n && idx < k;) {
        if (p[i].ft <= bag[idx]) {
            q.push(p[i++].sd);
            continue;
        }
        while (idx < k && bag[idx] < p[i].ft) {
            if (!q.empty()) {
                ans += q.top();
                q.pop();
            }
            idx++;
        }
    }
    cout << ans;
}
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함