这是我遇到的一个有趣的问题:
我们只说一个长度为M
的数字行,其中0 < M <= 1,000,000,000
,您给出了N
(1 < N <= 100,000
}个整数点对。在每对中,第一个点表示对象当前所在的位置,第二个点表示对象应移动的位置。 (请注意,second
点可能小于而不是first
。
现在,假设您从点0
开始并拥有一个可以容纳1
对象的购物车。您希望将所有对象从其初始位置移动到各自的最终位置,同时沿着数字线行进最小距离(不位移)。你必须以点M
结束。
现在,我一直在尝试将此问题简化为更简单的问题。说实话,我甚至不能想到蛮力(可能贪婪)的解决方案。然而,我的第一个想法是将向后运动退化为两个向前运动,但这似乎并不适用于所有情况。
我在
中抽出了这些3
个示例测试用例
第一个测试用例的答案是12
。首先,您在点red
处选择0
项。然后移动到6
(距离= 6
),暂时删除red
项,然后选择green
项。然后移至5
(距离= 1
)并删除green
项。然后你回到6
点(距离= 1
)并拿起你丢弃的red
项目,移到第9点(距离= 3
),然后转到点10
(距离= 1
)以完成序列。
行进的总距离是6 + 1 + 1 + 3 + 1 = 12
,这是可能的最小距离。
我认为其他两个案例的答案为12
。但是,我找不到解决它的一般规则。
有人有任何想法吗?
答案 0 :(得分:0)
可能是我误解了这个问题,但以下内容如何:
它被排序的事实保证你不会来回移动元素以将它们放置在适当的位置(无论该行是否表示为数组或列表)
@templatetypedef评论后更新:
使用HashTable
存储所有对。使用每对的当前位置作为索引键
在对上使用第二个索引。
1. Get next pair according to index from the line.
2. If current pair exists in hashtable then place element to its target location.
2.a Remove pair from hashtable.
2.b Make current pair the target location. Then go to step 1
ELSE
Increment current index until you get a pair present in the hashtable. Go to step 2
答案 1 :(得分:0)
假设您获得了这些移动(a, b), (c, d), (e, f), ...
,那么您必须行进的最小距离为abs(b - a) + abs(d - c) + abs(f - e) + ...
,并且您行进的实际距离为abs(b - a) + abs(c - b) + abs(d - c) + abs(e - d) + ...
。
基本上,给定一系列移动,重点是通过交换元素来最小化“移动距离”功能。如果您将特定组合视为一个节点,并且您可以将其作为边缘从中获得的所有组合,则可以使用许多图搜索算法中的一种,并使用启发式算法。一个例子是beam search。
答案 2 :(得分:0)
This is the asymmetric traveling salesman problem。您可以将其视为图形。边缘将是每个(开始,结束)对,每个对应一个(0,开始),以及所有其他对(完成,开始)。
假设NP!= P,它将具有指数预期的运行时间。