Contest 988

A

開個桶記一下。spa

時間複雜度 \(O\left(n+a\right)\)code

B

按長度從小到大排序,顯然若是存在合法的排列那這樣子必定是其中一種(長度相同的字符串必定要相同,能夠隨便換)。排序

暴力找是 \(O\left(\left|S\right|^2\right)\) 的(相鄰兩個最多配長度差次),KMP 能夠作到 \(O\left(n\left|S\right|\right)\),還要加上排序的 \(O\left(n\log n\left|S\right|\right)\)隊列

C

由於要兩個不一樣的序列,因此枚舉當前序列刪哪一個數,看一下以前有沒有這個和,作完後再枚舉一遍丟進 map字符串

時間複雜度 \(O\left(\sum n\log\sum n\right)\)class

D

三個數字在兩個數字的基礎上添加一個數字,相鄰的兩個差值要相等。基礎

四個數字在三個數字的基礎上添加一個數字,不存在合法的方案。map

更多的數字都創建在四個數字的基礎上,不存在合法的方案。移動

而後隨便枚舉一下就是了。時間

時間複雜度 \(O\left(n\log n\log x\right)\)

E

能被 \(25\) 整除無非最後兩位是 \(\texttt{00 25 50 75}\),嘗試把它們移到最後便可。

找到離結尾最近的最後兩位數字(優先找最後一位數字),它們分別位於 \(x\)\(y\) 位置。須要注意移動時候出現前導 \(0\) 的狀況:

  • \(x\) 位於開頭且開頭第二個數字是 \(0\)\(y\) 不是開頭第二個(若是是就說明以前沒有 \(0\),先移 \(y\) 確定不會出問題)。
  • \(y\) 位於開頭且開頭第二個數字是 \(0\)

這兩種狀況須要向前找到第一個不爲 \(0\) 的數,設其位於 \(z\) 位置,並把它換到開頭。

至於 \(z\) 是否是在咱們選取的位置不重要,由於若是是的話能夠先日後換。

好比說 \(20053\),先變成 \(20035\),再變成 \(32005\),最後變成 \(30025\)

但細心的同窗可能又會發現,若是這個數在選取的位置而且以前沒有非 \(0\) 數了呢?

好比說 \(20050\),應該不存在以 \(\texttt{25}\) 結尾的方案。

這是會出錯的。可是這種狀況就算這麼算了,也不會影響答案,另外一種狀況中的移動次數必定會更小。好比說上例以 \(50\) 結尾就行了。

嘗試分類討論,首先 \(x\)\(y\) 不可能均是 \(0\)

  • 找不到 \(\boldsymbol z\)
    • \(x\) 開頭,此時 \(x\) 一定爲 \(5\)。此時無論後面有幾個 \(0\) 都沒事,確定直接合法了,不用管。
    • \(y\) 開頭,此時 \(x\) 一定不爲 \(0\),與找不到 \(z\) 矛盾,不存在這種狀況。
  • 選取的位置後面有 \(0\)
    • 選取的位置上的數是 \(5\),在 \(\texttt{50}\) 的時候會直接將選取的位置向後換。
  • 選取的位置後面沒有 \(0\),在 \(\texttt{00}\) 的時候會直接將選取的位置向前換。

而後就作完啦!時間複雜度 \(O\left(\log n\right)\)

F

\(f_{i,j}\) 表示走到 \(i\) 位置拿着第 \(j\) 把傘的最小疲勞值。若 \(j\)\(0\) 則表明沒有拿傘。

走回頭路顯然不優,因此沒有後效性。

時間複雜度 \(O\left(am\right)\)

爲何不能貪心呢?不一樣傘須要走的路程是不一樣的。但相似單調隊列,靠前還重的確定沒有用了。

相關文章
相關標籤/搜索