Codeforces 800-1300 刷題筆記

zhuluoan發表於2024-06-10

CF1946B Maximum Sum

這道題是一道貪心題。

對於第 \(1\) 次操作,選擇的話肯定是選最大的好,所以我們會找出原序列的最大子段和進行插入,為了使下一次的插入子段更大,所以我們一定會插入原序列的最大子段和中。進行 \(m\) 次操作,執行 \(m\) 次上述操作即可。

直接模擬的話肯定不行,我們考慮找找規律,由於每次插入都是插入現在序列的最大子段和中,所以每次插入的值都是翻倍增長的,易發現這是一個等比數列的求和。我們如果模擬上述操作,複雜度為 \(\mathcal{O}(m)\),可以接受。

最後注意取模。

CF1004B Sonya and Exhibition

設區間 \([l,r]\)\(1\)\(x\) 個,\(0\)\(y\) 個,當 \(x\)\(y\) 最接近的時候,\(x \times y\) 最大,此結論可以用二次函式進行證明。接下來,考慮怎樣構造使得 \(x\)\(y\) 最接近。策略是交替輸出 \(0\)\(1\),這樣做的正確性是顯然的。

CF899C Dividing the numbers

一道很好的構造題。

\(f(x)\) 表示 \(n=x\) 時的答案。

\(x=0\) 時,\(f(x)=0\)

\(x=1\) 時,\(f(x)=1\)

\(x=2\) 時,\(f(x)=1\)

\(x=3\) 時,因為 \(3=1+2\),所以 \(f(x)=0\)

\(x>3\) 時,因為有 \((x-1)+(x-2)=(x-3)+x\),所以 \(f(x)=f(x-4)\)

依據 \(n \bmod 4\) 分類討論即可。

如何證明次做法的正確性呢?令 \(a=\sum \limits_{i=1}^{n} i\),如果 \(a\) 是奇數,那麼最優答案就是 \(1\),否則是 \(0\),利用高斯公式依次計算出上述情況下的 \(a\),並判斷即可證明,在此不再贅述。

CF78B Easter Eggs

\(s=\texttt{ROYGBIV}\),對於前 \(i\) 個彩蛋 \((1 \le i \le n-3)\),第 \(i\) 個為 \(s_{(i-1) \bmod 4}\),這樣可以保證 \([1,n-3]\) 這段區間滿足條件 \(2\),對於後 \(3\) 個彩蛋,直接輸出 \(\texttt{BIV}\),這樣就滿足了條件 \(1\),由我們的構造做法可知,\([n-6,n]\) 這個區間是 \(\texttt{ROYGBIV}\)\([n-2,4]\)(題目要求是環)這段區間是 \(\texttt{BIVROYG}\),都是符合條件的,故整個環符合條件 \(2\),然後就做完了。

CF1759C Thermostat

分類討論題

  • 如果 \(a=b\),那麼不需要移動,\(ans=0\)

  • 如果 \(\lvert a-b \rvert \ge x\),移動 \(1\) 次就可以了,那麼 \(ans=1\)

  • 為了使移動距離儘可能大,最好的方法是移動到邊界,即先移動到 \(l\)\(r\),再到 \(b\),那麼 \(ans=2\)。判斷條件為 \(\left\{ \begin{array}{} a-l \ge x\\ b-l \ge x \end{array} \right.\) 或者 \(\left\{ \begin{array}{} r-b \ge x\\ r-a \ge x \end{array} \right.\)

  • 如果上述情況還是不滿足,我們可以透過兩個端點進行 \(3\) 次移動,即 \(a \rightarrow l \rightarrow r \rightarrow b\)\(a \rightarrow r \rightarrow l \rightarrow b\),判斷條件為 \(\left\{ \begin{array}{} a-l \ge x\\ r-b \ge x \end{array} \right.\) 或者 \(\left\{ \begin{array}{} r-a \ge x\\ b-l \ge x \end{array} \right.\)

由於兩邊端點都已經嘗試過了,再移動已經沒有意義了,故最多隻能有 \(3\) 步,其餘的情況都是無解,輸出 \(-1\)

CF1768B Quick Sort

易發現如果要讓序列排序,那麼原序列中 \(x \sim x+1\) 之間的所有數字都是需要移動的,所以原序列中只有一個最長的連續上升子序列是不需要動的,設其長度為 \(m\),那麼需要移動的數字數量為 \(n-m\),由於每次可以移動 \(k\) 個且自動排序,故答案為 \(\left \lceil \frac{n-m}{k} \right \rceil\)

CF1832B Maximum Sum

比較坑的一道題,直接雙指標模擬貪心是不行的。

先將序列排序,設大的數刪了 \(x\) 個,那麼小的數刪了 \(2 \times (k-x)\),由於它是從頭和尾刪數,所以我們可以確定刪了那些,統計字首和字尾和,列舉 \(x\),更新答案即可。

CF1903B StORage room

考慮按位或運算的性質,即 \(a\)\(b\) 某一位上都為 \(0\),那麼它們或起來的那一位上也是 \(0\),反之,如果 \(M_{i,j}\) 的第 \(x\) 位上是 \(0\),那麼 \(a_i\)\(a_j\) 的第 \(x\) 位上也是 \(0\),所以我們可以先將 \(a\) 的每一位上都賦值為 \(1\),再列舉 \(M\),利用與運算執行上述操作(將 \(a_i\)\(a_j\) 與上 \(M_{i,j}\),由於與是隻有兩個 \(1\) 才是 \(1\),所以如果 \(M_{i,j}\) 的某一位上是 \(0\),那麼 \(a_i\)\(a_j\) 的相應位置上也是 \(0\) 了),最後將生成的 \(a\) 再代回檢查一遍,如果不滿足就是無解,否則輸出即可。

CF1918B Minimize Inversions

\(a\) 陣列排序,就可以最小化兩個序列中逆序對的個數的和了,證明如下:

\(a\) 排序了之後,對於任意一對 \(i\)\(j\),兩陣列中逆序對之和數量 \(x\) 最大為 \(1\),當 \(x=0\) 時,交換後 \(x\)\(2\),當 \(x=1\) 時,交換後 \(x\)\(1\),所以再怎麼交換都不可能更優了,故現在的序列即為最優解。

相關文章