我需要有关此ACM ICPC问题的帮助。我目前的想法是将此模型建模为最短路径问题,在问题说明中对此进行了描述。
问题
除了以外,N = 1000
沿一维数字线位于不同位置的有核废料容器。一个人的任务是收集所有垃圾箱。垃圾容器每秒钟收集一次,就会发出1单位的辐射。人开始时可以每秒移动一次,收集废物所花费的时间可以忽略不计。我们希望找到收集所有容器时释放的最小辐射量。-500,000 to 500,000
x=0
x = 0
1
输入样例:
4
位于的集装箱[-12, -2, 3, 7]
。
收集这些容器的最佳顺序是[-2, 3, 7, -12]
,以减少50
单位散发。说明:该人-2
在2秒钟内进入,在此期间2 units
辐射被发射。然后,他到达3
(距离:),5
以便枪管释放2 + 5 = 7
出辐射单位。他需要4
更多的时间才能到达x = 7
那个发射桶的地方2 + 5 + 4 = 11
。他花了19
几秒钟到达x = -12
那个桶发射2 + 5 + 4 + 19 = 30
单位的地方。2 + 7 + 11 + 30 = 50
,这就是答案。
笔记
有一个明显的O(N!)
解决方案。但是,我研究了贪婪的方法,例如移到最近的方法,或移到最近的聚类方法,但是这些方法没有用。
我考虑了这个问题已经有一段时间了,并且已经将其建模为图形搜索问题:
- 我们插入
0
作为基准位置(这将是初始状态) - 然后,我们将位置从最小到最大排序。
- 然后,我们执行BFS / PFS,其中
state
包括- 两个整数
l
和r
它们代表我们已经访问过的排序位置数组中的连续范围 - 一个整数
loc
,告诉我们我们是在范围的左侧还是右侧 - 一个整数
time
告诉我们经过时间 - 整数“成本”,告诉我们到目前为止的总成本(基于我们访问过的节点)
- 两个整数
- 从每个状态我们可以移至[l-1,r]和[l,r + 1],相应地调整其他3个整数
- 最终状态为[0,N],检查两个结束位置。
但是,似乎[L, R, loc]
并不能唯一地定义状态,因此我们必须存储L, R, loc, and time
,同时最小化cost
每个状态。这导致了指数算法,对于任何优点来说仍然太慢了。
谁能帮助我扩展我的想法或将我推向正确的方向?
编辑:也许可以将其建模为动态编程优化问题?考虑它,它与图形搜索解决方案具有相同的问题-仅仅因为电流cost
很低并不意味着它是该子问题的最佳答案,因为后者time
也会极大地影响答案。
贪婪不起作用:我有一个贪婪的选择算法,该算法估算移动到特定位置的成本(例如,如果我们向右移动,我们到左桶的距离加倍,等等)。
您可以使用启发式方法进行优先级优先搜索吗?该启发式方法可以将当前行程的成本与经过的时间相结合。