我有一条无限长的街道停着车。但是我无法在任何地方看到免费的停车场,但我知道在我可以停放车的地方必须有一个免费停车位。目的是采取最短的方式,我只能向左或向右。
假设我知道免费停车场的方向,我会直接朝那个方向行驶,因此我会通过" A"停车场。
现在我需要一个算法,需要通过不超过10 *停车场才能找到一个免费的停车场。我从家门口开始......" A"不知道。
我首先将街道视为一个阵列,停放的汽车是阵列的元素。 True表示空位,false表示空位。搜索完成,直到找到布尔值为真。这将是我的基本想法。但比这更重要的是搜索是如何完成的。
我可能会走一条路,然后两路走另一条路,循环,所以我得到类似的东西:1,-2,4,-8,16 ......直到我找到了空位。
但我不确定它是否能在不到10 * A的时候解决......
答案 0 :(得分:5)
让我们按照您的指示应用一种算法,并在没有找到空停车场的情况下继续使用:
所以在步骤 n ,你将首先从起点开始 2 n-1 ,然后返回相同的距离,所以在这一步中你总共走了 2 n 批次。
考虑前面步骤中的行进距离,这使得在步骤 n 之后总距离Σ i = 1..n (2 i ), 2 n + 1 - 2 。
因此,如果免费停车场远离起点 A ,那么如果我们幸运的话,那么将在步骤 ceil(logA)+1 中访问该地段关于方面,或者一步之后,即步骤 ceil(logA)+2 。
因此,在最坏的情况下(第二个),总行进距离是步骤 ceil(logA)+1 的距离,加上剩余的步骤 A 从最后一步的起点开始(被中断)。那就是 2 (ceil(logA)+1)+1 - 2 ,(这是 4A-2 和 8A-3 )加上 A 。这小于 9A-2 ,因此符合要求。
答案 1 :(得分:0)
您的解决方案有效。
你可以驾驶到错误一侧的最远距离是2 * A.在错误的一侧驱动的总距离是2A + A + A / 2 ... = 4A
右侧行走的最大总距离为A + A + A / 2 + A / 4 ... = 3A
所以最多你需要旅行7 * A.
EG。 A = 9。错边= 16 + 8 + 4 + 2 + 1 = 31。 右侧= 9 + 8 + 4 + 2 + 1 = 24
总计= 55 < 7 * 9 = 63。
PS:好的。我有点误解了你的问题。但方法仍然相同。我会让剩下的让你去锻炼。