Timus 1791 汽车过桥的问题

来源:互联网 发布:linux ssh远程登录命令 编辑:程序博客网 时间:2024/03/29 01:47
原题地址 http://acm.timus.ru/problem.aspx?space=1&num=1791

中文地址http://www.51nod.com/question/index.html#!questionId=705


一座桥,一辆车通过的时间是1分钟,同一时间只能有1辆车在桥上,桥的一边有N辆车排队,另一边有M辆车排队。每辆车有个开始排队时间Ti,和从排队开始一直到到达对面所能忍受的最大时间Pi(否则就会迟到)。两边的车辆都需要按照开始排队的时间一个个走。问是否存在一种过桥方式,使得所有车都不会迟到。

n,m<=100,000,ti,pi<=10^8(Ti是开始排队的时间,Pi是忍受时间)

依题意,每辆车的最晚出发时间为 t[i] + p[i] - 1,定义函数F(t,i,j)∈{true, false},其中t >= 1 表示当前时间,i ∈ [1..M+1] 表示t时刻左边第一辆车的序号,j ∈ [1..N+1]表示t时刻右边第一辆车的序号,那么初始状态为F(1,1,1)

如果左边右边所有车都已经通过则返回true:
F(t,i,j) = true
if ( i == M+1 && j == N+1 )              

如果当前时间已经晚于左边或右边剩余第一辆车的最晚出发时间则返回fase:
F(t,i,j) = false
if ( i <= M && t_left[i] + p_left[i] - 1 < t  ) || ( j<=N && t_right[j] + p_right[j] -1 < t )

如果左右都有车可放行,让左边走一辆或者让右边走一辆:
F(t,i,j) = F(t+1, i+1, j ) || F(t+1, i, j+1 )
if ( i <= M && t_left[i] <= t && j <= N && t_right[j] <= t )

如果左边没有车可以放行,右边有车可以放行:
F(t,i,j) = F(t+1, i, j+1)
if ( i ==M+1 || t_left[i] > t ) && ( j <=N && t_right[j] <= t )

如果左边有车可以放行,右边没有车可以放行:
F(t,i,j) = F(t+1,i+1,j)
if ( i<=M && t_left[i] <= t ) && ( j == N+1 || t_right[j] > t )

如果左右都没有车可以放行:
F(t,i,j) = F(t+1,i,j)
if ( i<=M && t_left[i] > t ) && ( j <=N && t_right[j] > t )

原创粉丝点击