Google Code Jam 2020 Round1B Join the Ranks

題意

給你一個形如\(1,2,\cdots,R,1,2,\cdots,R,1\cdots\)的序列,共重複\(C\)次。你每次能夠選擇一個區間\([L,R]\)將其平移到序列首部,最終使得序列具備\([1,1,\cdots,1,2,2,\cdots,2,\cdots,R,R,\cdots,R]\)的形式。問最少須要多少次,並輸出具體步驟。spa

解題思路

比賽的時候只來得及寫前兩道,這道題是賽後看dls錄播後補的。啥都不說了,dlstxdy!class

對於相鄰且相同的元素,咱們就把他合併成\(1\)個元素,要求的序列形式就變爲\([1,2,\cdots,R]\)方法

對於一個序列,把他的一段區間平移到序列的首部,很容易能夠證出最多刪掉兩個元素。移動

好比對於\([[1,2],[3,1],2,3,1,2,3]\),咱們能夠把第一個\([3,1]\)移到序列首部,獲得\([3,1,1,2,2,3,1,2,3]\),合併相鄰且相同的元素後是\([[3,1],[2,3],1,2,3]\),而後再把第一個\([2,3]\)移動到序列首部,獲得\([2,3,3,1,1,2,3]\),合併後是\([[2,3],[1,2],3]\),而後再把第一個\([1,2]\)移動到序列首部,獲得\([1,2,3]\)比賽

若是咱們每次都刪掉兩個元素,那麼使用的次數確定是最少的。可是還有一種特殊狀況,好比\(R=5,C=2\)的時候按上述方法縮到最後會獲得\([5,1,2,3,4,5]\)的序列。這種狀況下就把\([1,2,3,4,5]\)移動到序列首部,而後就能夠獲得\([1,2,3,4,5]\),這樣子也確定是最優的。math

而後由於\(R,C\)的取值範圍比較小,直接模擬就完事了。

相關文章
相關標籤/搜索