提出实现目标的最短时间的算法
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) )。
【讨论】:
以上是关于提出实现目标的最短时间的算法的主要内容,如果未能解决你的问题,请参考以下文章
今天看到别人的面试算法题,求找出十包粉末中两包蓝色粉末的最短时间
Leetcode 1199 建造街区的最短时间(贪心算法及证明)