1

问题:

Siruseri 市的规划无可挑剔。城市被划分为一个矩形阵列,由 M 行 N 列的单元组成。每个小区都有一个地铁站。每行有一列火车从左到右向后行驶,每列有一列从上到下向后行驶。每列火车在某个时间 T 开始,并永远沿着它的路线(一行或一列)来回行驶。

普通火车从一站到下一站需要两个单位的时间。有些快速列车只需要一个单位的时间就可以从一站到下一站。最后,有些慢车需要三个单位的时间从一个站到下一个站。您可以假设任何车站的停车时间都可以忽略不计。下面是一个 3 行 4 列的地铁系统的描述:

S(1) F(2) O(2) F(4)
F(3) . . . .
S(2) . . . .
O(2) . . . .

每行/列开头的标签表示火车的类型(F 代表快速,O 代表普通,S 代表慢速)及其开始时间。因此,沿第 1 行行驶的火车是一列快速列车,它在时间 3 开始。它从车站 (1,1) 开始向右移动,分别在时间 3、4、5 和 6 访问沿该行的车站。然后它在 6、7、8 和 9 时间从右到左返回访问车站。它现在再次移动,在 9、10、11 和 12 时间访问车站,依此类推。同样,沿第 3 列的火车是在时间 2 开始的普通火车。因此,从 (3,1) 站开始,它在时间 2、4 和 6 访问第 3 列上的三个车站,然后返回到顶部专栏在 6,8 和 10 次访问他们,依此类推。

给定起始站、起始时间和目的地站,您的任务是确定乘坐这些火车到达目的地的最早时间。例如,假设我们在时间 8 从站 (2,3) 开始,我们的目标是到达站 (1,1)。我们可能在时间 8 乘坐第二排的慢车,在时间 11 到达 (2,4)。碰巧在时间 11,第 4 列的快车在 (2,4) 向上行驶,所以我们可以乘坐这辆快车并在时间 12 到达 (1,4)。再一次我们很幸运,在时间 12 时,第 1 排的快车在 (1,4),所以我们可以乘坐这辆快车并到达 (1 ,1) 在时间 15。另一种路线是在时间 8 从 (2,3) 乘坐第 3 列的普通火车,并在时间 10 到达 (1,3)。然后我们在那里等到时间 13,然后乘坐第 1 排的快速列车向左行驶,到达 (1,

测试数据:你可以假设M,N≤50。
时间限制:3秒

由于 N,M 的大小非常小,我们可以尝试通过递归来解决它。

在每个车站,我们乘坐两列火车,可以带我们更接近目的地。
例如:如果我们想从 2,3 到 1,1,我们乘坐更靠近 2,3 的火车,然后下到离目的地最近的车站,同时记录我们所用的时间,如果我们到达目的地,我们记录到目前为止的最短时间,如果到达目的地的时间小于最短时间,我们更新它。

我们可以使用以下方法确定火车在特定时间的哪个站:

/* S is the starting time of the train and N is the number of stations it
 visits, T is the time for which we want to find the station the train is at. 
T always be greater than S*/

T = T-S+1
Station(T) = T%N, if T%N = 0, then Station(T) = N;

这是我的问题:

  • 我们如何确定特定列车以我们想要的方向到达我们想要的车站的最早时间?

  • 由于我上面的算法使用了贪心策略,它会给出一个准确的答案吗?如果没有,那么我该如何解决这个问题?

PS:这不是作业,是在线判断题

4

1 回答 1

4

我相信贪婪的解决方案在这里会失败,但是构建一个反例会有点困难。

这个问题旨在使用 Dijkstra 算法来解决。边是相邻节点之间的连接,取决于火车的类型及其开始时间。您也不需要计算整个图 - 只需为您正在考虑的当前节点计算边缘。我已经解决了许多类似的问题,这就是您解决的方式。在我知道它永远不会通过之前,我也尝试过多次使用贪婪。

希望这可以帮助。

于 2013-01-09T09:18:12.590 回答