考え方
使ったクーポンの$D_{i}$の総和を最大化する.クーポン$i$は「(定価)$\geq L_{i}$」を満たす商品に適用できる.同じクーポンならなるべく定価が小さいものに使ったほうが有利.
- 商品の定価を小さい順に見ていき
- 定価$p$の商品に対して$S_{p} = \{D_{i}\,|\, p\geq L_{i},i=1,\ldots, M\}$のなかから最大の$D_{i}$となるクーポンを使う
定価を小さい順に見ていくとき,集合列$\{S_{p}\}$は単調増加になる.よって,$S_{p}$は優先度付きキューで管理できる.
回答例
from collections import deque from heapq import heapify, heappop, heappush N, M = map(int, input().split()) P = list(map(int, input().split())) L = list(map(int, input().split())) D = list(map(int, input().split())) P.sort() Li = [(l, i) for i, l in enumerate(L)] Li.sort() Li = deque(Li) ans = 0 q = [] for p in P: ans += p while Li and p >= Li[0][0]: l, i = Li.popleft() heappush(q, -D[i]) if q: ans += heappop(q) print(ans)