当前位置: 首页 > backend >正文

二叉堆-对顶堆 P1090-P1168-P2085

二叉堆是一颗完全二叉树,而且每个根节点都比子节点大

封装好的大根堆模块有:(小根堆的话只需要将存入的权值添个负号,取出来的时候再负负得正)

python   heapq模块 / deque中的PriorityQueue

C++       STL中priority_queue

python中的heapq主要操作:

        heapq.heappush(堆名,元素)        插入元素

        heapq.heappop(堆名)                  返回最小元素(最大元素得在入堆和出堆时添负号)

        heapq.heapify(列表名)                 将列表->堆化(堆名等于原列表名)

初始化的话可以直接hp=[ ]

P1090

import heapqdef mc(n, fruits):#列表转堆heapq.heapify(fruits)total_cost = 0# 不断合并直到只剩下一堆while len(fruits) > 1:# 取出最小的两个元素first = heapq.heappop(fruits)second = heapq.heappop(fruits)cost = first + secondtotal_cost += cost# 将新元素放回堆中heapq.heappush(fruits, cost)return total_costn = int(input())
fruits = list(map(int, input().split()))print(mc(n, fruits))

P1168

那么就是一个大根堆和一个小根堆的对顶堆

1.如果新元素 ≤ 大顶堆的堆顶(即最大值),放进大顶堆。
2.否则放进小顶堆。
3.然后再检查是否平衡,不平衡就搬堆顶元素过去。

根据长度比较,保持两个堆的数目平衡(有点类似于双向bfs),从而方便提取中位数

import heapqclass DualHeap:def __init__(self):self.max_heap = []  # 大顶堆(用负数模拟)self.min_heap = []  # 小顶堆def add(self, num):if not self.max_heap or num <= -self.max_heap[0]:heapq.heappush(self.max_heap, -num)else:heapq.heappush(self.min_heap, num)        if len(self.max_heap) > len(self.min_heap) + 1:heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))elif len(self.min_heap) > len(self.max_heap):heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap))def get_median(self):if len(self.max_heap) > len(self.min_heap):return -self.max_heap[0] #其实这里一定是第一个分支#因为本题输出时个数为奇,一定是大顶堆多一个else:return (-self.max_heap[0] + self.min_heap[0]) / 2n=int(input())
l=list(map(int,input().split()))hq=DualHeap()
for i in range(n):hq.add(l[i])if (i+1)%2==1:print(hq.get_median())

P2085 

P2085 最小函数值 - 洛谷

从小到大输出,数学关系上保证 F(x+1)>F(x),但是在不同A,B,C的情况下无法比较F值,所以得用最小堆从小到大地平行地处理各个F

import heapqn,m=map(int,input().split())s=[]
for i in range(n):s.append(tuple(map(int,input().split())))#用tuple才方便下面解包hp=[]#直接用数组初始化即可
for i in range(len(s)):#从x等于1开始平行初始化a,b,c=s[i]fnow=a*1**2+b*1*1+cheapq.heappush(hp,(fnow,i,1))#元素:值,fi,xres=[]
for j in range(m):val,i,x=heapq.heappop(hp)res.append(val)a,b,c=s[i]newx=x+1fnow=a*newx**2+b*newx+cheapq.heappush(hp,(fnow,i,newx))print(*res)

http://www.xdnf.cn/news/2185.html

相关文章:

  • Java后端开发——分层解耦详解
  • Springboot用IDEA打jar包 运行时 错误: 找不到或无法加载主类
  • RAG vs 微调:大模型知识更新的最优解之争
  • Rule.resource作用说明
  • 使用 binlog2sql 闪回 MySQL8 数据
  • C++武功秘籍 | 入门知识点
  • 【Typecho】给Joe主题后台添加custom自定义功能!
  • 安装docker,在docker上安装mysql,docker上安装nginx
  • 华为云Astro canvas大屏与iotDA是怎样通过数据接入、数据中心的功能传输和通讯的?
  • 桌面端开发技术栈选型:开启高效开发之旅
  • WPF框架中异步、多线程、高性能、零拷贝技术的应用示例
  • 基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
  • SpringBoot集成WebSocket,单元测试执行报错
  • lnmp1.5+centos7版本安装php8
  • C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象
  • gin框架学习笔记
  • 学习笔记(算法学习+Maven)
  • 基于Matlab的MDF文件导入与处理研究
  • 一文详解Adobe Photoshop 2025安装教程
  • SourceTree与git搭建gitcode团队管理项目
  • 精益数据分析(26/126):依据商业模式确定关键指标
  • Python-41:最小替换子串长度
  • uml类关系(实现、继承,聚合、组合,依赖、关联)
  • Word/WPS 删除最后一页空白页,且保持前面布局样式不变
  • Linux——进程间通信
  • Android Compose 框架矢量图标深入剖析(七)
  • C语言中结构体的字节对齐的应用
  • ABAP Object Services
  • 纯PHP写的自适应收款单页源码(对接易支付)
  • WPF 调用 OpenCV 库