※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1202번 문제인 보석 도둑이다.
문제는 아래 링크를 확인하자.
https://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
담을 수 있는 무게가 적은 가방서부터 살펴보면서 그 가방에 담을 수 있는 가장 무거운 보석을 담는 것으로 이 문제를 해결할 수 있다.
이는 우선순위 큐에 현재 살펴보는 가방이 담을 수 있는 무게 이하의, 아직 담지 않은 보석들의 가격을 담아 관리하는 것으로 간단히 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
struct query {
int w, p;
query(int w, int p) {
this->w = w, this->p = p;
}
};
bool comp(query q1, query q2) {
if (q1.w != q2.w) return q1.w < q2.w;
return q1.p > q2.p;
}
vector<query> q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, K; cin >> N >> K;
while (N--) {
int w, p; cin >> w >> p;
q.emplace_back(query(w, p));
}
while (K--) {
int w; cin >> w;
q.emplace_back(query(w, -1));
}
sort(q.begin(), q.end(), comp);
ll ans = 0;
priority_queue<int> pq;
for (auto current : q) {
if (current.p < 0) {
if (pq.empty()) continue;
ans += pq.top(); pq.pop();
}
else {
pq.push(current.p);
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 18116 // C++] 로봇 조립 (0) | 2021.10.16 |
---|---|
[BOJ 2515 // C++] 전시장 (0) | 2021.10.15 |
[BOJ 2583 // C++] 영역 구하기 (0) | 2021.10.13 |
[BOJ 8112 // C++] 0과 1 - 2 (0) | 2021.10.12 |
[BOJ 8111 // C++] 0과 1 (0) | 2021.10.11 |