題目大意:
一維平面上給你n
nn個汽車在位置p
ip_i
pi,以速度v
iv_i
vi往右行駛。當兩車相遇的時候,速度變為兩車最慢速度。現在問你每個車它與下一輛車(車隊)相遇的時間。
n ≤1
e5n \leq 1e5
n≤1e5
題目思路:
顯然我們有乙個暴力的n
2n^2
n2,對每個車,求出它與後面那些車相遇的最短時間.
畫在s −v
s-vs−
v二維座標系中,我們就是要求t=s
j−si
vi−v
jt=\frac
t=vi−
vjs
j−s
i的最小值.那麼就是求點對之間的斜率最大值.
分析過程:
這個我們可以利用單調棧來實現:令入棧順序為:cn,
cn−1
,...
,c1c_n,c_,...,c_1
cn,cn
−1,
...,
c1假設當前點為c
ic_i
ci,棧頂元素c
xc_x
cx,
0.若棧為空,則它不會與任何車相遇。
1.若其速度大於等於c
ic_i
ci,則它倆永遠不會相遇,則它對c
ic_i
ci的答案的更新沒有作用,也對之後的點沒有作用。(因為c
ic_i
ci是cx,
x∈[1
,i]c_x,x\in[1,i]
cx,x∈
[1,i
]的速度瓶頸,後面的車速度無法超過c
ic_i
ci).所以將其彈出棧頂.
2.1否則,假設棧頂元素和它的最大斜率配對為:(cx
,cy)
,x<
y(c_x,c_y),x(c
x,c
y),
x<
y.那麼如果ki,x,y
k_ki,x
,y.則ki,
y>ki
,xk_>k_
ki,y
>ki
,x(k
kk為點對斜率).這種情況用白話講就是:c
ic_i
ci會在c
xc_x
cx和c
yc_y
cy相遇之後再匯合。所以對於c
ic_i
ci來講,瓶頸就是c
yc_y
cy.所以這個時候我們就需要將c
xc_x
cx彈出棧,繼續這個過程,如下圖所示:
2.2 反之的話,ki,y,x
k_ < k_
ki,y,x
.這種情況用白話講就是:c
ic_i
ci會在c
xc_x
cx和c
yc_y
cy相遇之前與c
xc_x
cx匯合。那麼答案就是(ci
,cx)
(c_i,c_x)
(ci,c
x).這個時候停止這個過程即可.如下圖所示:
2.3 結束這個過程後將i
ii入棧.
從上面兩個過程可以看出,我們的單調棧就會維護乙個下凸包.因為這樣是最優的。
class
solution
vector<
double
>
getcollisiontimes
(vector
int>>
& a)
if(res ==
1e9) ans[i]=-
1;else ans[i]
= res;
}return ans;}}
;
LeetCode 853 車隊 排序
n 輛車沿著一條車道駛向位於 target 英里之外的共同目的地。每輛車 i 以恆定的速度 speed i 英里 小時 從初始位置 position i 英里 沿車道駛向目的地。一輛車永遠不會超過前面的另一輛車,但它可以追上去,並與前車以相同的速度緊接著行駛。此時,我們會忽略這兩輛車之間的距離,也就...
力扣 1094 拼車
拼車問題 假設你是一位順風車司機,車上最初有 capacity 個空座位可以用來載客。由於道路的限制,車 只能 向乙個方向行駛 也就是說,不允許掉頭或改變方向,你可以將其想象為乙個向量 這兒有乙份乘客行程計畫表 trips,其中 trips i num passengers,start locati...
力扣 單調棧與單調佇列問題
單調棧 1.402.移掉k位數字 需要注意邊界情況,去除完無字元返回 判斷時不能有 號,棧內應該是不嚴格遞增的。2.316.去除重複字母 需要借助雜湊表來統計出現次數,並且標記是否已經存在於棧內。3.84.柱狀圖中最大的矩形,挺難的,針對每乙個柱需要確定左右比它低的作為邊界,正向遍歷單調棧確定左邊界...