Timus 1791 汽車過橋的問題

2021-06-10 16:12:29 字數 1178 閱讀 1788

原題位址

中文位址

一座橋,一輛車通過的時間是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)∈,其中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 )

1791 裝置編號

6.c c 數字轉字串 string str to string i 7.查詢字元 字串 t.find p,begin strting npos include using namespace std class solution return count 待實現函式,在此函式中填入答題 int g...

Timus 1110 Power 除盡問題

you are given the whole numbers n,mand y.write a program that will find all whole numbers xin the interval 0,m 1 such that xnmod m y.the input contain...

timus1004 最小環 Floyd 演算法

通過別人的資料搞了好久才成功,果然還是不夠成熟 做題目還是演算法不能融會貫通 大意即找出圖中至少3個頂點的環,且將環中點按順序輸出 用floyd演算法求最小環 因為floyd演算法求最短路徑是通過中間量k的增加而更新的 演算法流程 對於k,我們知道利用floyd演算法求出任意兩點i,j最短距離,僅通...