Back to Blog List

[λ°±μ€€] [C++] πŸ’Ž 보석 도둑 1202번

←Algorithm

문제 μ„€λͺ…

λ°±μ€€ 보석 도둑

Blog Image

그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μ•„λ‹ˆλ©΄ 무쑰건 μ‹œκ°„μ΄ˆκ³Ό λ°œμƒ.


μ ‘κ·Ό 방법

μž‘μ€ κ°€λ°©λΆ€ν„° λ‹΄μ•„μ•Ό ν•œλ‹€. -> 가방을 μ •λ ¬

가방에 담을 λ•Œ, 가방에 담을 수 μžˆλŠ” 것쀑에 κ°€μž₯ κ°€μΉ˜κ°€ 높은 것뢀터 λ‹΄μ•„μ•Ό 그리디 μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.


μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν•œ 풀이

cpp
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define MAX 300001 /* 그리디 μ•Œκ³ λ¦¬μ¦˜μ˜ 쒋은 문제 κ°€λ°©μ˜ μš©λŸ‰μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ 담을 수 μžˆλŠ” λ¬Όν’ˆμ€‘μ— κ°€μž₯ κ°€μΉ˜κ°€ 높은 λ¬Όν’ˆμ„ λ‹΄λŠ”λ‹€. */ int N, K; pii jewerly[MAX]; int C[MAX]; priority_queue<int> pq; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); 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 >> C[i]; } // 무게 순으둜 μ •λ ¬ sort(jewerly, jewerly+N); sort(C, C+K); int idx = 0; ll sum = 0; // μž‘μ€ κ°€λ°©λΆ€ν„° 졜적의 κ°€μΉ˜λ₯Ό λ„£κΈ° for (int i = 0; i < K; i++) { // 넣을 수 μžˆλŠ” 것듀 pq에 일단 λ„£κΈ° while (idx < N) { if (C[i] < jewerly[idx].first) break; // λͺ»λ‹΄λŠ” 무게 λ‚˜μ˜€λ©΄ pq.push(jewerly[idx].second); idx++; } // 넣을 수 μžˆλŠ” 것쀑에 κ°€μΉ˜κ°€ κ°€μž₯ 높은 물건 λ„£κΈ° // λ‚˜λ¨Έμ§€λŠ” κ·ΈλŒ€λ‘œ μ €μž₯ν•˜λŠ”κ²Œ μ€‘μš” if (!pq.empty()) { sum += pq.top(); pq.pop(); } } cout << sum; return 0; }

마무리

가방을 μž‘μ€ μˆœμ„œλ‘œ μ •λ ¬ν•œ ν›„, 넣을 수 μžˆλŠ” 보석 μ€‘μ—μ„œ κ°€μΉ˜κ°€ 높은 것뢀터 λ„£λŠ”λ‹€λŠ” 생각이 맀우 ν•˜κΈ° μ–΄λ €μ› λ‹€.

μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜λŠ” λ¬Έμ œλ“€μ€ μ°Έ μƒκ°ν•˜κΈ° μ–΄λ €μš΄ 것 κ°™λ‹€.

근데 μ°Έ λ§€λ ₯적인 λ¬Έμ œμΈκ²ƒ κ°™λ‹€.