CSP-S2021试题T1廊桥分配详讲
來遲了來遲了,忘寫了。
我們來看看這道卡了本蒟蒻3個小時的題。
傳送門luoguP7913廊橋分配
題目大意:分為了國內(nèi)和國外兩部分,飛機(jī)來了要么停廊橋要么走,有空位一定停,且停最小的,要如何分配廊橋才能使停的飛機(jī)數(shù)最大。
首先我們要知道一個事實:
對于n架飛機(jī),有無數(shù)個廊橋,其中的一架飛機(jī)k,能夠停在廊橋的要求是總的廊橋數(shù)大于等于從第一架來的飛機(jī)到它飛來時使它能停到廊橋的廊橋數(shù)。
換而言之,對于某一架飛機(jī),使它能停靠的廊橋數(shù)與有多少個廊橋無關(guān)。
至于為什么,我們可以思考:
盡管有無數(shù)個廊橋,但是飛機(jī)是嚴(yán)格按照停靠在最小的廊橋上,只要能滿足前k架飛機(jī)能全部停廊橋數(shù),那么其余的廊橋是沒有用上的。
得到這個事實我們可以得到:
可以就用給出的總廊橋數(shù)來模擬,對于每一個廊橋,可以統(tǒng)計出在這個廊橋有多少個飛機(jī)停,所以總飛機(jī)停靠個數(shù)就是1~k個廊橋上的飛機(jī)總和,這個只需要前綴和處理即可,最后枚舉分配給國內(nèi),國外的廊橋數(shù),并加到一起,更新max即可。
我們應(yīng)該如何模擬飛機(jī)離開和進(jìn)入呢?
這里使用兩個優(yōu)先隊列來分別維護(hù)最小編號的廊橋和所在哪個廊橋的飛機(jī)離開時間。
首先先按飛機(jī)來的時間進(jìn)行排序,將編號最小的廊橋給它,刪除該廊橋,再將它的離開時間和該廊橋編號壓入另一小根堆中,并以離開時間為第一關(guān)鍵字來排序。
對于每一架來的飛機(jī),比較它來的時間和堆中飛機(jī)離開時間,若離開時間小于了來的時間,那么就說明該飛機(jī)已經(jīng)離開,刪除該飛機(jī),并又將它所在的廊橋編號壓入堆中,循環(huán)直達(dá)堆頂飛機(jī)的離開時間大于了它來的時間。
然后就又重復(fù)操作,取出最小編號的廊橋,刪除,將該廊橋和它離開時間一同壓入堆中即可。
處理完后,我們得到每一廊橋停靠的飛機(jī)數(shù)量,那么統(tǒng)計前綴和即是有這么多個廊橋能停靠的飛機(jī)總數(shù)量。枚舉比較即可。
時間復(fù)雜度O(nlog2n)
代碼實現(xiàn):
總結(jié)
以上是生活随笔為你收集整理的CSP-S2021试题T1廊桥分配详讲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EZwall国标协议添加第三方网络视频录
- 下一篇: 实现上下移动鼠标进入扩展第二个屏幕