1. 程式人生 > >NOIP2011 D2T3 觀光公交 做題筆記

NOIP2011 D2T3 觀光公交 做題筆記

解釋 inline 加速器 cal 相同 根據 expected expect block

目錄

  • 歸納題目的性質
  • 算法
    • 60分
    • 100分
  • 總結

歸納題目的性質

每一個加速器效果相同(1)

車子等到所有人上車之後才會發車, 這個最早發車時間不由加速器的配比決定(2)

要優化的對象: "所有人搭車時間總和". (3)

算法

根據性質(2), 我們可以預處理出這個"最早發車時間", 記為\(start_i\)

60分

根據(2), (3)設計算法, 想到DP.

令站點i, 使用加速器個數為j的最晚發車時間為\(dp_{i, j}\)(蘊含性質1), 則可以由\(dp_{i, j} \rightarrow dp_{i+1, k}(k>j)\), 其中貢獻可以預處理(思考性質3)

復雜度\(O(nk^2)\)

100分

思考貪心: 把整個列車系統看成一個整體(前一個算法是把每一站分拆), 將每個加速器的貢獻拆開. (性質1)

思考加速器的性質 : 在每一站使用都相同(令其為性質4), 考慮枚舉在當前狀態下哪一站加速最佳.(在\(O(n)\)內)

定義如下符號:
\[ rb_i: 加速器設在第i站的影響範圍(先不解釋)\tim_i: 在當前狀態下, 汽車開至第i站最佳時間\l_i: i\rightarrow i+1 時間 \]

警告: 以下筆記, 不加說明

is Station is ok_to_optimize : \(tim_i+l_i > start_{i+1}\) (this have continuity)

so we can calculate rb(i) :
\[ rb_i = i\ \text{if not ok_to_opt}\\text{else } rb_i = rb_{i+1} \]
opt_station_i.range(): {those destination at [i+1, rb_i + 1] } (consider it more, important)

警告結束

經過k次叠代我們就做完啦(滑稽)
complexity \(O(nk)\), it‘s unexpected but it works(and also fast)!

總結

這個"iteration" 有點像 pagerank algorithm, 雖然 low 多了

NOIP2011 D2T3 觀光公交 做題筆記