문제
세계적인 도둑 동현이는 보석점을 털기로 결심했다.
동현이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 동현이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 각 가방에는 최대 한 개의 보석만 넣을 수 있다.
동현이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)
다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (1 ≤ Mi, Vi ≤ 1,000,000)
다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)
모든 숫자는 양의 정수이다.
출력
첫째 줄에 동현이가 훔칠 수 있는 보석 가격의 합의 최대값을 출력한다.
힌트
입력 예제
3 2
1 65
5 23
2 99
10
2
출력 예제
164
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <iostream> #include <queue> #include <algorithm> #include <limits.h> //Jewel ------------------- void argueInput(); void Jewel(); //Jewel ------------------- int main( int argc, char ** argv) { Jewel(); return 0; } struct Node{ int M; int V; bool operator < ( const Node &node) const { return M < node.M; } }; //Jewel ------------------- int N, K; Node node[300000]; //무게 , 무게 int C[300000]; //가방최대무게 void argueInput(){ scanf ( "%d %d" , &N, &K); int M, V; for ( int i=0; i<N; i++){ scanf ( "%d %d" , &M, &V); node[i].M = M; node[i].V = V; } for ( int i=0; i<K; i++){ scanf ( "%d" , &C[i]); } } void Jewel(){ argueInput(); std::sort(node, node+N); std::sort(C, C+K); std::priority_queue< int > jewelQueue; long long answer = 0; int j = 0; for ( int i=0; i<K; i++){ while (j<N){ if (node[j].M > C[i]){ break ; } else { jewelQueue.push(node[j].V); j++; } } if (jewelQueue.size() != 0){ answer += ( long long )jewelQueue.top(); jewelQueue.pop(); } } printf ( "%lld" ,answer); } //Jewel ------------------- |