原题地址 http://acm.timus.ru/problem.aspx?space=1&num=1791
依题意,每辆车的最晚出发时间为 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 )
中文地址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 )