安排具有给定旅行时间的人

时间:2014-01-07 16:19:12

标签: algorithm puzzle

这是一个谜题,但我认为它可能是一个我不知道的经典算法:

  

山下有n个人,每个人都想上山,然后下山。我有时间去爬这座山,并且有时间去下山    但是,在同一时间最远 1个人可以爬, atmost 1个人可以下山。找到最短的时间去上山下山。


更新1:
好吧,我尝试了几个例子,发现它不能简化为sortingor getting the fastest climbers first,反之亦然。我认为要获得optimal解决方案,我们可能需要尝试所有可能的解决方案,因此似乎是NP complete


我的初步猜测:(错误)
我认为解决方案是贪婪的:按起始时间按升序排序。然后是jth person upkth down u[j]<= d[k]d[k] is minimum from all k persons on top of mountain。我无法证明这一点的正确性。


还有其他想法如何处理?
提示就足够了。

4 个答案:

答案 0 :(得分:0)

尝试以下列方式思考:如果人们没有按照时间的升序排序,那么他们攀登山峰的情况要比如果找到一对不正确的相邻人员(例如一个人比第二个人爬得更久)并交换它们。总时间有可能增加吗?

答案 1 :(得分:0)

我认为这是不正确的。考虑

u = [2,3]
d = [1,3]

您的算法会给出排序0,1,而它应该是1,0

我会建议另一种贪婪的做法:

  • 创建ordering列表并添加第一个人。
  • 对于当前订购,请跟踪两个值:
    • mU - 最后一个人在山上的时间 - 结束时间
    • mD - 第一次下降的最早时间
  • 从未订购的人中选择最小化abs(mD - d)abs(mU - u)的人。然后如果abs(mD - d) < abs(mU - u)他应该在ordering的开头。否则他会走到最后。

这里可能仍然需要进行一些调整,但这种方法可以最大限度地减少案例中给出的损失。

答案 2 :(得分:0)

以下解决方案仅适用于n&lt; = 24。

此解决方案需要理解动态编程位掩码技术知识。

观察 :我们可以很容易地发现最佳总爬升时间固定,这相当于总爬升时间n人。

对于基本情况,如果n = 1,解决方案是显而易见的。

对于n = 2,解决方案很简单,只需扫描所有4种可能性并计算最小停机时间。

对于n = 3,我们可以看到这种情况将等于一个人首先爬升,然后是两个人的情况。 并且可以容易地预先计算两个人的最小停机时间。 更重要,这两个人可以视为一个人,上升时间是两个人的总上行时间,而停机时间是最短停机时间。 使用位掩码技术将所有结果存储在n = 0到n = 3的情况下的最小停机时间,使用位掩码技术,我们将3个人的状态表示为索引3 = 111b,因此结果为n = 3将是:

 for(int i = 0; i < 3; i++){
      dp[3] = min(dp[(1<<i)] +  dp[3^(1<<i)],dp[3]);
 }

对于n = 4 ... 24,解决方案类似于n = 3的情况。

注意:实际公式不仅仅是简单,因为案例n = 3的代码(并且需要类似的方法来解决案例n = 2),但是非常相似,

答案 3 :(得分:0)

你的方法看起来很合理,但它可能过于简化了,你能在这里更准确地描述它吗? 根据你的描述,我无法弄清楚你是在分类还是其他东西;这些是我认为你正在使用的启发式方法:

  • 首先获得最快的登山者,所以开始使用Down路径 尽快。
  • 确保山顶上总有人,所以 当Down路径可用时,一个人开始下降 你这样做的方法就是首先选择那些人 快速攀爬,慢慢下降。

如果最快的登山者也是最快的下降者怎么办?这将使Down路径空闲,直到第二个登山者到达顶部,您的算法如何确保这是最佳顺序?我不确定问题是否会减少到排序问题,它看起来更像是背包或调度类型。