NOIP2011 D2T3 觀光公交 做題筆記
目錄
- 歸納題目的性質
- 算法
- 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 觀光公交 做題筆記