문제 해결의 각 단계에서 매 순간에 최선이라고 생각되는 선택을 해서 전체 문제에 대한 최적의 해를 구하는 알고리즘
즉, 지역적 최적해를 모아서 전역적 최적해를 구하는 방식이다.
구현 -> 완전 탐색(브루트포스) -> DP -> 그리디순서로 접근하기
그리디 알고리즘은 거의 대부분 정렬을 사용해서 구현한다.
sort(a.begin(), a.end()) -> 오름 차순 정렬
sort(a.begin(), a.end(), cmp) -> cmp에 따라 정렬
priority_queue<int> pq1; -> 내림차순의 우선순위 큐 생성
priority_queue<int, vector<int>, greater<int>> pq2; -> 오름차순의 우선순위 큐 생성
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k, ret, temp1, temp;
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
cin >> n >> k;
vector<pair<ll,ll>> v(n);
vector<ll> vv(k);
for(int i = 0; i < n; i++){
cin >> v[i].first >> v[i].second;
}
for(int i = 0; i < k; i++) cin >> vv[i];
sort(v.begin(), v.end());
sort(vv.begin(), vv.end());
priority_queue<ll> pq;
int j = 0;
for(int i = 0; i < k; i++){
while(j < n && v[j].first <= vv[i]) pq.push(v[j++].second);
if(pq.size()){
ret += pq.top(); pq.pop();
}
}
cout << ret << "\n";
return 0;
}