带后悔贪心问题

[JSOI2007]建筑抢修

https://ac.nowcoder.com/acm/problem/20154

看了题解,这是个带后悔贪心问题,这里给出python3答案。
如果不使用优先级队列,会超时!
python3 优先级队列在queue中,为了避免定制一个q = queue.PriorityQueue() 还是用小顶堆heapq吧
1、heappush(heap, x):向堆中添加元素
2、heappop(heap):弹出堆中最小的元素,并且维持剩余元素的堆结构
4、heapreplace(heap, x):弹出堆中最小的元素,然后将新元素插入。
5、nlargest(n, iter)、nsmallest(n, iter):用来寻找任何可迭代对象iter中的前n个最大的或前n个最小的元素。
python没有提供大顶堆的实现,想要使用大顶堆需要一些trick。heappush(e)改为heappush(-e),heappop(e)为-heappop(e),也就是说存入和取出的数都是相反数,其他逻辑和TopK相同。
注意!!!弹出的是负数!!!弹出的是负数!!!。。。

import sys
from heapq import * 
n=int(input())
a=[]
for i in range(n):
    line = sys.stdin.readline().strip()
    ai=tuple(map(int,line.split()))
    a.append(ai)

a=sorted(a,key=lambda x:x[1], reverse=False)
cost=0
f=[]
for i in range(n):
    #f.append(a[i][0])
    heappush(f, -a[i][0]) 
    cost=cost+a[i][0]
    if cost>a[i][1]:
        #regret=max(f)
        #f.remove(regret)
        regret=heappop(f)
        cost=cost-(-regret)

print(len(f))
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务