1202번 보석도둑
세계적인 도둑 상덕이는 보석점을 털기로 결심했다.
상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)
다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)
다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)
모든 숫자는 양의 정수이다.
첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.
가방에 담을 수 있는 최대 무게를 넘기지 않고 보석을 담아서 보석 가격의 합의 최대 구하기
처음에는 우선순위 큐를 사용한다는 생각을 못해서
bag벡터에 매번 가격 순으로 내림차순 정렬을 해서 가장 가격이 높은 보석을 찾는 방법을 사용했다. 하지만 우선순위 큐를 사용한다면 큐에 데이터를 넣을 때마다 알아서 내림차순 정렬로 가장 가격이 높은 순으로 정렬이 되기 때문에 시간 복잡도 측면에서 훨씬 개선할 수 있다.
우선순위 큐-C++
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int N, K;
cin >> N >> K;
vector<pair<int,int>> jewel(N);
for (int i = 0; i < N; i++) {
//무게, 가치
cin >> jewel[i].first >> jewel[i].second;
}
vector<int> capacity(K);
for(int i = 0; i < K; i++){
cin >> capacity[i];
}
sort(jewel.begin(), jewel.end());
sort(capacity.begin(),capacity.end());
long long answer = 0;
int index= 0;
priority_queue<int> bag;
for (int i = 0; i < K; i++) {
while (index < N && jewel[index].first <= capacity[i]) {
bag.push(jewel[index].second);
index++;
}
if(!bag.empty()){
answer += bag.top();
bag.pop();
}
}
cout << answer << endl;
}
🌟 초기화
jewelcapacity 를 생성한다.int N, K;
cin >> N >> K;
vector<pair<int,int>> jewel(N);
for (int i = 0; i < N; i++) {
//무게, 가치
cin >> jewel[i].first >> jewel[i].second;
}
vector<int> capacity(K);
for(int i = 0; i < K; i++){
cin >> capacity[i];
}
🌟 정렬
sort(jewel.begin(), jewel.end());
sort(capacity.begin(),capacity.end());
🌟 로직
bag 생성long long answer = 0;
int index= 0;
priority_queue<int> bag;
for (int i = 0; i < K; i++) {
while (index < N && jewel[index].first <= capacity[i]) {
bag.push(jewel[index].second);
index++;
}
if(!bag.empty()){
answer += bag.top();
bag.pop();
}
}