https://www.acmicpc.net/problem/1202
- 가방을 용량 순으로 정렬한다.
- 보석을 가치의 역순으로 정렬한다.
- 보석을 하나씩 꺼내고 이분탐색(lower bound)로 용량에 맞는 가방을 찾으면 결과에 더해준다.
- 가방과 보석을 각각 용량과 무게 순으로 정렬한다.
- 가방을 하나씩 선택하여 해당 용량보다 작은 보석을 우선순위큐(가치 큰 것 우선)에 모두 넣어준다.
- 모두 넣으면 하나를 빼서 결과에 더한다. (해당 가방에 담을 수 있는 가장 큰 가치의 보석)
import java.io.*;
import java.util.*;
public class Main{
static StringTokenizer st;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
PriorityQueue<int[]> pqueue = new PriorityQueue<int[]>((e1, e2) -> {
return e2[1] - e1[1];
});
int[][] jewels = new int[N][2];
int[] bags = new int[K];
for (int n = 0; n < N; n++) {
st = new StringTokenizer(br.readLine());
jewels[n][0] = Integer.parseInt(st.nextToken());
jewels[n][1] = Integer.parseInt(st.nextToken());
}
for (int k = 0; k < K; k++) {
bags[k] = Integer.parseInt(br.readLine());
}
Arrays.sort(jewels, (e1, e2) -> {
return e1[0] - e2[0];
});
Arrays.sort(bags);
int index = 0;
long answer = 0;
for (int k = 0; k < K; k++) {
int nowBag = bags[k];
while (index < N) {
if (jewels[index][0] <= nowBag) {
pqueue.add(jewels[index].clone());
index++;
} else {
break;
}
}
if(!pqueue.isEmpty()) {
answer += pqueue.poll()[1];
}
}
System.out.println(answer);
}
}