蓝桥 1024 第 2 场算法双周赛 通关【算法赛】
时间:2023.10.25
题目地址:通关【算法赛】
题目分析
看代码注释吧,优先队列,理清楚就行了。
代码
from queue import PriorityQueue
def main():
n, p = map(int, input().split())
select = [[] for i in range(n)] # 存第i层通关后解锁的层
reward, require = [],[] # v 存第i层通过奖励经验;w 存第i层通过经验
pq = PriorityQueue()
# 初始化第一层
first = [int(i) for i in input().split()]
reward.append(first[1])
require.append(first[2])
sum = 0
if (p < first[2]):
print(sum)
return
p += first[1]
sum += 1
for i in range(1,n):
a, b, c = [int(i) for i in input().split()]
reward.append(b)
require.append(c)
select[a-1].append(i)
for i in select[0]:
pq.put((require[i],i)) # 优先队列里为:已解锁的关卡(前置关卡通过了)以(priority, item) = (通过经验, 第几层)。
# 初始化结束
while not pq.empty():
cur = pq.get() # 每次取优先级最小的,即为:通过经验最小的
if(p < cur[0]):
print(sum)
return
p += reward[cur[1]]
sum += 1
# 更新解锁的关卡
for i in select[cur[1]]:
pq.put((require[i], i))
print(sum)
main()