# Meteor Coding Cup Round #4 臨時被抓去打的,給高中生的競賽程式用的比賽。 題目我覺得給高中競賽現役玩挺好的,不過我太久沒碰競賽程式了打得很爛。 (搞不好對高中現役來說過簡單,我就不知道了) ## Problem A. 快閃旋風 簡單實作題,看到數字範圍只有 10000 就知道開一條 boolean 陣列就十分充裕了。 > 最後會落在所有沒有障礙物的點中,離原目標點最近的點。 這行沒看到讓我吃了四個 penalty ... 不管實作效率的話,朋友有用 python set 運算來寫,寫起來可讀性還滿高, 果然沒競賽底子腦袋思考方式差很多? ## Problem B. Coins 巴斯卡三角形 梯形公式 簡單數學題。 注意一下\\(10^{10}\\)有 int 溢出問題就好。 輸入很不方便 很奇怪 不明白為什麼要這樣設計。 ## Problem C. 帶權排序 這題跟 Google Code Jam Qualification Round 2018 Trouble Sort 有異曲同工的感覺。 那題大約是這樣的: > 給定一個陣列,大小 \\(\leq 10^{5}\\) , > 對他進行變種的泡泡排序,即每次看相鄰三個的頭尾大小,若逆序則把它們顛倒。 > 求排序後的陣列模樣。 關鍵的觀察都是,此種三元數組交換會變成奇數項偶數項互不干擾, 所以將奇數項偶數項各自獨立排序好後合併即可。 回到本題,若已排序的陣列\\(A'\\)中的偶數項和\\(A\\)中的偶數項組成不同, 那一定需要花成本進行調換。 進一步發現由於三元數組交換不需要成本,只要計算兩邊偶數項的組成相差多少即可。 ## Problem D. Pocker Card 沒寫完... 其實意外滿好寫。 對每個撲克牌 \\((c,n)\\) 以 \\(n\times100+26-\text{ord}(c)\\) 重標號後排序即可。 對於移動牌數,只要該撲克牌沒有比他前面所有牌還大就需要移動,也就是要簡單維持前綴極值。 ## Problem E. 瑪雅金字塔 ~~其實應該是馬雅吧~~ 看到 \\(10^{18}\\) 就要想到矩陣快速冪。 但是我太久沒寫了,重新推了一遍,尷尬。 簡單講一下好了: \\(\text{F}(i+3)=\text{F}(i+2)+\text{F}(i+1)+\text{F}(i)\\) 把連續三項寫出來 \\(\text{F}(i+3)=\text{F}(i+2)+\text{F}(i+1)+\text{F}(i)\\) \\(\text{F}(i+2)=\text{F}(i+2)\\) \\(\text{F}(i+1)=\text{F}(i+1)\\) 轉成轉移矩陣的樣子 $$ \left[ \begin{matrix} \text{F}(i+3) \\ \text{F}(i+2) \\ \text{F}(i+1) \end{matrix} \right]= \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{matrix} \right] \left[ \begin{matrix} \text{F}(i+2) \\ \text{F}(i+1) \\ \text{F}(i) \end{matrix} \right] $$ 所以有 $$ \left[ \begin{matrix} \text{F}(N) \\ \text{F}(N-1) \\ \text{F}(N-2) \end{matrix} \right]= \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{matrix} \right]^N \left[ \begin{matrix} 1 \\ 0 \\ 0 \end{matrix} \right] $$ ## Problem F. 線段覆蓋問題 求最大覆蓋範圍的類似線段覆蓋問題。 資料離散化後DP即可。 大概是個 $$ \text{DP}[i] = \text{max}_{j, \text{exist segment [i,j]}}\{\text{DP}[j] + (i-j)\} $$ 這樣子的轉移方程。 ## Problem G. 硬幣投擲 還沒想