二元組的限制
考慮拓撲排序
正向拓撲不能保證最優,因卡的是結束時間
所以方向建圖topo
從n為0時間,
相當於在n-k[i]的時間出現一架飛機
小根堆維護,每次選擇當前最早出現的一架飛機起飛。
由於保證有解,這個顯然是正確的,對於當前只有一架飛機,不飛白不飛(當然也不能不飛);多架飛機,先飛後飛反正都是要飛,所以隨便飛乙個
第二問受第一問啟發,如果找到了當前飛機i,先不放進堆裡面,如果當前沒有了飛機可以飛,就讓i飛。
實際上,我們是故意讓i飛機來了不飛,等著同一時間別的飛機飛完(上面第一問的證明可以保證這樣還是有解),自己再飛(這個時候必須要飛了)。
倒序topo考慮是乙個關鍵點
因為卡的是截止時間,從前往後,並不知道先放誰更好,
而如果倒著,相當於某個時刻有了乙個可以有的決策,往往比乙個東西可能會過期處理起來方便
例如:[noi2017]蔬菜——時光倒流+貪心
再如:
NOI2010 航空管制
首先第一問是很好做的,因為題目中保證有合法解,所以我們盡量讓期限晚的航班晚起飛.所以就是反著建圖,按照拓撲序給每個航班安排時間.第二問要求問所有合法解中每個航班最早什麼時候能起飛.那麼還是參考第一問的思路,額外的一點就是讓能安排在它後面的航班都安排到後面.所以就是先限制不選它,直到剩下的沒有辦法再選...
NOI2010 航空管制
貪心。對於第1個問,我們先建立拓撲圖,對於如果a必須在b前起飛,那麼連有向邊b a,並求出點的入度。將所有入度為0的點放在乙個優先佇列裡,按最大起飛編號從大到小排序。我們從後往前考慮起飛的航班。取出優先佇列中最大起飛編號最大的點,作為最後乙個航班,並刪去拓撲圖中與他相連的邊,如果有新的點的入度變成0...
NOI2010 航空管制
對於第一問,對於每條限制 u,v 我們連邊 v rightarrow u 這樣將構成一張 rm dag 首先先拓撲排序,對於拓撲序考前的點我們先讓他盡量往後放,顯然這樣是最優的,因為我們在偏序滿足條件的情況下讓每個點盡量後放以保證方案的合法性,但需要注意的一點是可能拓撲序大的點能放的位置比較靠後而拓...