Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- java
- Android Room
- Jetpack Room
- 1644 파이썬
- 1753 파이썬
- 1806 백준
- 1753 다익스트라
- 5582 DP
- 5582 파이썬
- 투포인터 알고리즘
- 이진 탐색
- Coroutine Flow
- 자바
- 백준 10819
- 1003 파이썬
- 10819 파이썬
- git local remote
- android hilt
- 백준 1644
- 2096 파이썬
- 안드로이드 hilt
- 1806 투포인터
- flow buffering
- 백준 2096
- 1806 파이썬
- 코루틴 플로우
- Android mvp
- 백준 5582
- 자료구조
- 6588 파이썬
Archives
- Today
- Total
Gemstone's Devlog
[백준] 1202번: 보석 도둑 (우선순위 큐) 본문
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
그림판으로 예제에 대한 그림을 한 번 그려보았다.
이 문제는 우선순위 큐로 접근해야하는 문제이다.
문제 풀이 방법은 다음과 같다.
우선 보석들과 가방들의 무게에 따라 리스트를 정렬한다.
임시 temp 리스트를 만들고 가장 무게가 작은 가방부터 순서대로 모든 보석들을 넣어본다.
(단, max_heap 우선순위 큐를 사용하며, 보석의 무게가 가방의 수용 가능 무게보다 작거나 같을 때에만 넣어준다.)
각 가방에 담을 수 있는 최대 가치의 보석을 담되 용량이 작은 가방부터 보석을 담는다.
가방의 순서를 신경쓰지 않고 보석을 담는다면 보석을 담지 못하는 경우가 생긴다.
풀이는 다음과 같다.
코드를 천천히 보면 이해가 될 것이다.
import sys, heapq
input = sys.stdin.readline
n, k = map(int, input().split())
jewels = [list(map(int, input().split())) for _ in range(n)]
bags = [int(input()) for _ in range(k)]
jewels.sort()
bags.sort()
ans = 0
temp = []
for bag in bags:
while jewels and bag >= jewels[0][0]:
heapq.heappush(temp, -jewels[0][1]) # max_heap
heapq.heappop(jewels)
if temp:
ans += heapq.heappop(temp)
elif not jewels:
break
print(-ans)
'Data Structure & Algorithms' 카테고리의 다른 글
[Codeforces] 768B: Code For 1 (0) | 2022.03.27 |
---|---|
[Codeforces] 448C: Painting Fence (0) | 2022.03.27 |
[백준] 1339번: 단어 수학 (그리디) (0) | 2022.03.24 |
[백준] 14889번: 스타트와 링크 (백트래킹) (0) | 2022.03.13 |
[Codeforces] 1285B: Just Eat It! (0) | 2022.03.10 |