提出实现目标的最短时间的算法

Posted

技术标签:

【中文标题】提出实现目标的最短时间的算法【英文标题】:Algorithm to come up with shortest day to reach a goal 【发布时间】:2016-01-22 13:45:00 【问题描述】:

我遇到了这个问题,不太确定如何解决。

我在想也许最好的方法是向东走 1 公里,然后向西走 2 公里,然后再走 3 公里……以此类推,直到我们到达出口。

我们站在一条左右走向的隧道中间。在距离我们未知的 K 公里处,是出口。我们不知道出口位于东边还是西边。也不知道到出口的距离K。

我们希望在尽可能短的时间内步行前往。假设我们每天可以步行 50 公里。给出一个算法,确保我们在O(K) 天内到达出口。争论你的算法是正确的。用一个例子解释你的算法。

【问题讨论】:

有没有关于隧道的细节或线索?根据您提供给我们的信息,我看不到任何出路,除非您在一个方向上以蛮力行走,直到您击中任一端。 嗨,我想帮你解决这个问题。但是,问题并不完全清楚。你能详细说明一下吗? O(K) 似乎很难,O(K * ln K) 似乎可以使用二进制搜索......好吧,也许不是。 【参考方案1】:

你在正确的轨道上。你需要在东西走向之间来回摆动,但不是将幅度增加一倍,而是每次增加一倍。

    向西行驶 1 公里。 返回原位,向东行驶 2 公里。 回到家,向西走4公里。 ...

这将确保您在 O(K) 天内到达出口。这是因为,如果 K 为 2^p,那么在到达出口之前,您将行驶最多 O(2^p) 公里。

例如:如果 K = 2^n + 1,最坏的情况可能是: 1 1 + 2 2 + 4 4 + 8 8 + 16 ... 2^(n) + 2^(n+1) 2^(n+1) + 2^n + 1 (O (9K) )。

【讨论】:

以上是关于提出实现目标的最短时间的算法的主要内容,如果未能解决你的问题,请参考以下文章

[算法]需要排序的最短子数组长度

今天看到别人的面试算法题,求找出十包粉末中两包蓝色粉末的最短时间

Dijkstra算法思想

Leetcode 1199 建造街区的最短时间(贪心算法及证明)

从一道算法面试题看我国信息科技的原创性不足:查找包含所有元素的最短子数组

算法/编程练习:和至少为K的最短子数组