公里(或其他值)再分配算法

时间:2013-11-22 10:37:56

标签: algorithm


我想知道是否有解决公里重新分配问题的算法,例如出租车的路径:

一开始我带巴特 在km 2,我带着荷马 在5公里处,我带Lenny和Carl 在公里7,我带Barney
在10公里处,我们到达了目的地

    Bart   |----------| 10km
    Homer    |--------| 8km
    Lenny       |-----| 5Km
    Carl        |-----| 5Km
    Barney        |---| 3Km

结果应如下所示:

编辑: 正确的结果是Nico Schertleranswer

Barney: 3km / 5 = 0.6 km
Carl: 3km / 5 + 5km / 4 = 1.4 km
Lenny: 3km / 5 + 5km / 4 = 1.4 km
荷马: 3km / 5 + 5km / 4 + 3 km / 2 = 2.2 km
Bart: 3km / 5 + 5km / 4 + 3 km / 2 + 2km = 4.2 km

0.6 km + 1.4 km + 1.4 km + 2.2 km + 4.2 km = 10 km

如果我得到一个圆润的结果,那就更好了,就像这样:

1 km + 1 km + 1 km + 2 km + 5 km + = 10 km

有什么想法吗?

步骤

1 个答案:

答案 0 :(得分:1)

您的计算不正确

0.6 km + 1.4 km + 1.4 km + 2.2 km + 4.2 km = 9.8 km;不是10!

你可能想要这样的东西:

     km |  0-2  |  2-5  |  5-7  |  7-10 | Sum
----------------------------------------------
Bart    | 2 / 1 | 3 / 2 | 2 / 4 | 3 / 5 | 4,6
Omer    |       | 3 / 2 | 2 / 4 | 3 / 5 | 2,6
Lenny   |       |       | 2 / 4 | 3 / 5 | 1,1 
Carl    |       |       | 2 / 4 | 3 / 5 | 1,1
Barney  |       |       |       | 3 / 5 | 0,6
                                         -----
                                         10,0 

所以我们可以从头开始解决问题。

我假设您有如下数据结构:

Person { name, startsAt, partialDistance = 0 }

第一步是按startsAt对人员列表进行排序。然后积累距离:

lastCheckPoint = totalDistance
participatingPersons = persons.length
for i from persons.length - 1 to 0
    currentPosition = persons[i].startsAt
    currentDistance = lastCheckPoint - currentPosition
    for j from 0 to i
        persons[j].partialDistance += currentDistance / participatingPersons
    next
    participatingPersons -= 1
    while i >= 1 && persons[i - 1].startsAt == currentPosition
        participatingPersons -= 1
        i -= 1
    loop
    lastCheckpoint = currentPosition
 next

这是基本的想法。在人员之间逐列分配部分距离。