반응형

https://www.acmicpc.net/problem/1202

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

 

가격 순으로 보석을 내림차순 정렬하고,

가격이 높은 순으로 가방에 담되, 그 보석을 담을 수 있는 가장 낮은 무게 제한의 가방에 담아주었습니다.

예를 들어, 보석의 가격과 무게가 [{99, 2}, {65, 1}, {23, 5}] 일 때,

99의 보석을 담기 위해 무게가 2 이상인 가장 작은 가방을 찾아주고,

65의 보석을 담기 위해 무게가 1 이상인 가장 작은 가방을 찾아주었습니다.

이를 빠르게 찾기 위해 lower bound 알고리즘을 이용하였습니다.

 

#include <iostream>
#include <algorithm>
#include <set>
#define MAX 300000
using namespace std;

int n, k, b;
long long ans = 0;
multiset<int> c;
pair<int, int> mv[MAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		cin >> mv[i].second >> mv[i].first;
	}
	for (int i = 0; i < k; i++) {
		cin >> b;
		c.insert(b);
	}

	sort(mv, mv + n);
	
	for (int i = n - 1; i >= 0 && !c.empty(); i--) {
		int vv = mv[i].first;
		int mm = mv[i].second;
		auto it = c.lower_bound(mm);
		if (it == c.end()) continue;
		c.erase(it);
		ans += vv;
	}
	cout << ans;
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2056 : 작업  (0) 2021.11.22
백준 10775 : 공항  (0) 2021.11.20
백준 1092 : 배  (0) 2021.11.20
백준 1439 : 뒤집기  (0) 2021.11.20
백준 1789 : 수들의 합  (0) 2021.11.20

+ Recent posts