1202번: 보석 도둑
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci
www.acmicpc.net
Heap을 사용하자!
처음에는 보석 무게 minheap을 만들어 가능한 보석을 찾고 그중에서 maxheap을 통해 가장 큰 가치를 찾는다.
- 보석들을 [무게, 가치]를 담는 minheap(jewel)을 생성한다.
- 가방은 bag에 담아 허용치순으로 정렬해준다.
- 보석의 가치를 담는 maxheap(candidate)를 생성한다.
- 작은 가방부터 돌면서 가장 무게가 작은 보석(jewel[0][0])이 가방에 들어간다면 계속 candidate에 넣어준다.
- 가치가 가장 큰 보석을 candidate에서 뽑아준다.
import sys import heapq input = sys.stdin.readline N, K = map(int, input().split()) jewel = [] bag = [] for _ in range(N): heapq.heappush(jewel, list(map(int, input().split()))) for _ in range(K): bag.append(int(input())) bag.sort() result = 0 candidate = [] for b in bag: while jewel and b >= jewel[0][0]: w, v = heapq.heappop(jewel) heapq.heappush(candidate, -v) if candidate: result -= heapq.heappop(candidate) print(result)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 4358] 생태학 (python) (0) | 2021.04.28 |
---|---|
[백준 1991] 트리 순회 (python) (0) | 2021.04.28 |
[백준 1655] 가운데를 말해요 (python) (0) | 2021.04.27 |
[백준 21608] 상어 초등학교 (python) (0) | 2021.04.26 |
[백준 14889] 스타트와 링크 (python) (0) | 2021.04.26 |
최근댓글