algorithm - 自行车马拉松 (JBOI 2013)

标签 algorithm

<分区>

我发现了这个叫做循环马拉松的问题:http://www.math.bas.bg/infos/files/2013-11-24-B2_eng.pdf来自 2013 年的 JBOI。

我已经尝试解决了一段时间,但没有运气......您介意指导我找到解决方案吗?

谢谢

最佳答案

一种可能性是将当前运行者存储在双向链表中(以便在运行者被淘汰后轻松删除运行者)。

对于每对第一名比第二名更快的连续运行者,计算他们相遇的时间并将这个时间存储在堆数据结构中(堆包含相遇时间和指向第二名运行者的指针) .

堆将允许您找到下一个运行者(这将是堆顶部的一对),然后您可以及时更新您的数据结构 O(logn) 并重复直到堆为空.

更新需要:

  1. 标记第二名选手已不在比赛中
  2. 从链表中移除第二名
  3. 将新的集合时间从第一个运行者添加到列表中的下一个(仅当第一个运行者足够快时)
  4. 重新平衡堆

如果本次 session 的第一名参赛者已从比赛中移除,则应跳过更新。

总的来说,这需要时间 O(nlogn)。

关于algorithm - 自行车马拉松 (JBOI 2013),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050487/

相关文章:

python - 使用 Python tensorflow 进行预测和预测

algorithm - 分析运行时间,Big O

algorithm - 噪声正弦时间序列中的实时峰值检测

python - 一星算法: Distance heuristics

performance - 获得 10000+ 个唯一的随机数(性能)

algorithm - “pattern-filling with tiles” 谜题

algorithm - for循环中递归的复杂性

c++ - 我的霍夫曼编码方法哪里出了问题?

java - 生成随机经纬度

algorithm - Dijkstra 与 Floyd-Warshall : Finding optimal route on all node pairs