문제 설명

그리디 알고리즘을 사용해야 한다. 아니면 무조건 시간초과 발생.
접근 방법
작은 가방부터 담아야 한다. -> 가방을 정렬
가방에 담을 때, 가방에 담을 수 있는 것중에 가장 가치가 높은 것부터 담아야 그리디 알고리즘이다.
우선순위 큐를 이용한 풀이
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;
}마무리
가방을 작은 순서로 정렬한 후, 넣을 수 있는 보석 중에서 가치가 높은 것부터 넣는다는 생각이 매우 하기 어려웠다.
우선순위 큐를 사용하는 문제들은 참 생각하기 어려운 것 같다.
근데 참 매력적인 문제인것 같다.