HDU多校1 - 6759 Leading Robots(单调栈)
題目鏈接:點(diǎn)擊查看
題目大意:n 個(gè)機(jī)器人在數(shù)軸上賽跑,給出每個(gè)機(jī)器人的起點(diǎn)和加速度,初始速度都為 0 ,問(wèn)有多少個(gè)機(jī)器人在賽跑的過(guò)程中可以成為最前面的一個(gè)
題目分析:又是被zx學(xué)長(zhǎng)秒掉的一道題,感謝zx學(xué)長(zhǎng)的耐心講解
首先根據(jù)高中物理知識(shí),根據(jù)已知條件,可以得到位移與時(shí)間的方程?,y 代表位移,x 代表時(shí)間,b 代表初始位置,k 代表加速度
因?yàn)槎际菕佄锞€,求交點(diǎn)非常的麻煩,因?yàn)槲覀冎恍枰蠼稽c(diǎn)的相對(duì)位置,所以可以將方程轉(zhuǎn)換為位移與時(shí)間的平方的方程:,這樣并不會(huì)影響交點(diǎn)的相對(duì)位置,同時(shí)將每一個(gè)位移曲線都轉(zhuǎn)換為一條直線表示了
那么如何將機(jī)器人成為最前面的一個(gè)體現(xiàn)出來(lái)呢?將 n 條直線對(duì)應(yīng)到平面直角坐標(biāo)系中,將 x 軸從 [ 0 , inf ) 劃分為無(wú)數(shù)個(gè)點(diǎn),對(duì)于每個(gè) x 而言,對(duì)應(yīng)位置最上面的那條直線所代表的機(jī)器人,就是在 x 時(shí)刻最領(lǐng)先的機(jī)器人,所以我們只需要統(tǒng)計(jì)有多少條直線成為過(guò)最上面的直線就好了
按照斜率排序,就可以發(fā)現(xiàn)相鄰的三條直線會(huì)出現(xiàn)下面兩種情況:
我們將直線 i - 1 與直線 i 的交點(diǎn)記為 ( x1 , y1 ) ,將直線 i 與直線 i + 1 的交點(diǎn)記為 ( x2 , y2 ) ,發(fā)現(xiàn)當(dāng) x1 < x2 時(shí),直線 i 所代表的機(jī)器人才有可能在最上面,而當(dāng) x1 >= x2 時(shí),直線 i 完全被直線 i - 1 和直線 i + 1 所擋住,也就無(wú)法在最上面了
到此為止,我們就可以利用單調(diào)棧來(lái)實(shí)現(xiàn)上述模擬了,棧內(nèi)維護(hù)的是都可以在最上面的直線,對(duì)于新遍歷到的直線 i ,因?yàn)槲覀円呀?jīng)按照斜率遞增了,顯然單調(diào)棧內(nèi)所有初始位置 b 小于當(dāng)前直線的直線都是不符合條件的,如下圖所示:
顯然在上圖中,st [ top ] 所代表的直線完全被第 i 條直線所覆蓋
還有就是對(duì)于棧中的元素,將 st[ top - 1 ] , st[ top ] 和 i 這三條直線分別對(duì)應(yīng)上文中的 i - 1 , i , i + 1 三條直線來(lái)比較交點(diǎn)的位置亦可以判斷合理性
最后有個(gè)坑點(diǎn),就是如果有兩個(gè)機(jī)器人,起點(diǎn)和加速度都是相同的話,那么這兩個(gè)機(jī)器人是不會(huì)對(duì)答案提供貢獻(xiàn)的,這個(gè)可以用 map 判斷一下
代碼:
?
?
總結(jié)
以上是生活随笔為你收集整理的HDU多校1 - 6759 Leading Robots(单调栈)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU多校1 - 6756 Findin
- 下一篇: HDU多校2 - 6767 New Eq