重返天梯-L3-005 垃圾箱分布 (30 分)(dijkstra)

该博客讨论了一道算法题,涉及使用C++实现堆优化的Dijkstra算法来解决垃圾箱最优分布问题。题目要求找到使所有居民点到垃圾箱最短距离最大且满足特定范围的解。博主在实现过程中遇到输出处理的困扰,最终通过动态更新和比较找到了解决方案。博客内容涵盖了算法设计、距离计算和结果优化策略。

题目分析

重返天梯-L3-005 垃圾箱分布 (30 分)原链接

这道题我板子都写好,结果卡在了结果的输出上hhhhh,输出上还是欠考虑了

题目好像有保留1位小数需要四舍五入,但是其实可以不用管它。如果想要四舍五入,可以用如下公式(round代表上取整):
a / b = r o u n d ( a / b ∗ 10 ) / 10 a/b=round(a/b*10)/10 a/b=round(a/b10)/10


以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。

现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。

这里是这道题对于输出的要求,我在这里没有处理到位

  • 首先需要遍历本轮选定的垃圾箱的dijkstra的结果,找出那个最短距离。同时还要判断每个居民点距离垃圾箱是否在规定的范围内。
  • 然后用这个最短距离,去与结果作比较,保留较大值。达到最短距离最长的目的
  • 还要考虑最短距离相等时的情况,这时候保留平均距离最短。由于是从前往后枚举的,保留了编号递增

我一开始写这道题时,把最短距离、编号、平均距离都存了下来,开了很多不同的数据结构,结果还没算出答案。因为结果只要求输出一组,我们只需要保留答案值,在过程中动态更新作比就好了

C++(堆dijkstra)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e3 + 100, M = 2e4 + 10;
int n, m, k, d;

int h[N], e[M]
### 最小堆(Min-Heap)概念 最小堆是一种特殊的完全二叉树结构,其特点是父节点的值总是小于或等于子节点的值。这种特性使得堆顶始终存储着整个集合中的最小值[^1]。 在实际应用中,最小堆常用于实现优先队列、调度算法以及各种优化问题。由于插入和删除操作的时间复杂度均为 \(O(\log n)\),因此它非常适合处理动态数据集。 --- ### Python 实现 Min-Heap 以下是基于 Python 的 `min_heap` 最小堆实现: ```python class MinHeap: def __init__(self): self.heap = [] def insert(self, value): """向堆中插入新元素""" self.heap.append(value) self._sift_up(len(self.heap) - 1) def extract_min(self): """提取并返回堆中的最小值""" if not self.heap: return None if len(self.heap) == 1: return self.heap.pop() root_value = self.heap[0] self.heap[0] = self.heap[-1] del self.heap[-1] self._sift_down(0) return root_value def _parent_index(self, index): """获取父节点索引""" return (index - 1) // 2 def _left_child_index(self, index): """获取左子节点索引""" return 2 * index + 1 def _right_child_index(self, index): """获取右子节点索引""" return 2 * index + 2 def _sift_up(self, index): """上浮调整""" parent_idx = self._parent_index(index) while index > 0 and self.heap[parent_idx] > self.heap[index]: self.heap[parent_idx], self.heap[index] = self.heap[index], self.heap[parent_idx] index = parent_idx parent_idx = self._parent_index(index) def _sift_down(self, index): """下沉调整""" size = len(self.heap) while True: smallest = index left_child = self._left_child_index(index) right_child = self._right_child_index(index) if left_child < size and self.heap[left_child] < self.heap[smallest]: smallest = left_child if right_child < size and self.heap[right_child] < self.heap[smallest]: smallest = right_child if smallest != index: self.heap[smallest], self.heap[index] = self.heap[index], self.heap[smallest] index = smallest else: break # 测试代码 if __name__ == "__main__": min_heap = MinHeap() elements = [3, 1, 6, 5, 2, 4] for elem in elements: min_heap.insert(elem) result = [] while True: val = min_heap.extract_min() if val is None: break result.append(val) print(result) # 输出应为升序序列 [1, 2, 3, 4, 5, 6] ``` 上述代码实现了基本的最小堆功能,包括插入 (`insert`) 和提取最小值 (`extract_min`) 操作,并通过 `_sift_up` 和 `_sift_down` 方法维护堆性质。 --- ### 应用场景 #### 1. **优先队列** 使用最小堆可以高效地管理一组具有不同优先级的任务。每次从队列中取出的是优先级最高的任务(即数值最小的任务),从而满足实时系统的调度需求。 #### 2. **K 小/大元素查找** 利用最小堆可以在大规模数据集中快速找到前 K 大或前 K 小的元素。例如,在海量日志析中筛选出访问量最大的页面[^3]。 #### 3. **Dijkstra 算法加速** Dijkstra 是一种经典的最短路径算法,而使用最小堆作为辅助数据结构可显著降低更新距离的操作成本,使整体性能提升至 \(O((V+E)\log V)\)[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeSlogan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值