我有这个算法问题,我想讨论一下。不是 关于找到解决方案,但关于运行时的优化。所以这就是:
假设我们有一个长度为L 的比赛场地和一共 N辆参赛 在比赛中。比赛规则很简单。一旦汽车超过另一辆车的第二辆 汽车被淘汰出局。当不再有可能超车时,比赛结束 发生 棘手的部分是第k辆汽车有一个起始点点x [k] 和一个 速度v [k] 。点数按升序给出,但速度 可能有所不同
到目前为止我做了什么:
编辑:我忘了写比赛的实际观点。目标是找到汽车退出游戏的顺序鉴于汽车只能被之前的汽车超越,我计算了时间 每辆车都要到达下一辆车
t = (x[i] - x[i+1])/(v[i] - v[i+1])
我将这些时间插入到 O(n log n)的最小堆中 所以理论上我必须弹出 O(logn)中的第一个元素,找到它的前一个, 弹出它,更新它的时间并再次将它插入堆中 像一个优先级队列。我的主要问题是如何访问a的特定点 以O(log n)或更快的速度堆积以保持O(n log n)级别的复杂性 这个程序应该写在Haskell上,所以我想保持简单 尽可能