这是一个谜题,但我认为它可能是一个我不知道的经典算法:
山下有n个人,每个人都想上山,然后下山。我有时间去爬这座山,并且有时间去下山 但是,在同一时间最远 1个人可以爬,和。 atmost 1个人可以下山。找到最短的时间去上山下山。
更新1:
好吧,我尝试了几个例子,发现它不能简化为sorting
,or getting the fastest climbers first
,反之亦然。我认为要获得optimal
解决方案,我们可能需要尝试所有可能的解决方案,因此似乎是NP complete
。
我的初步猜测:(错误)
我认为解决方案是贪婪的:按起始时间按升序排序。然后是jth person up
和kth down
u[j]<= d[k]
和d[k] is minimum from all k persons on top of mountain
。我无法证明这一点的正确性。
还有其他想法如何处理?
提示就足够了。
答案 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路径空闲,直到第二个登山者到达顶部,您的算法如何确保这是最佳顺序?我不确定问题是否会减少到排序问题,它看起来更像是背包或调度类型。