本文將會對 Codeforces 1450 A-H 進行探討。
題目連結
CF1450
題目分析
A
難度:入門
演算法標籤:字串
題目描述:對給定的字串內字元的順序進行調換,使 trygub
不是該字串的子串。
解題思路:
本題有多種思路。下面介紹其中兩種。
- 將字串內所有
b
字元移到字串開頭 - 對字串進行排序
容易證明這兩種方法都是正確的。
B
難度:普及−
演算法標籤:貪心(?)
題目描述:平面上有 \(n\) 個點。每次操作選擇一個點,將到這個點的曼哈頓距離不超過 \(k\) 的點刪除。問最少多少次操作後平面上只剩下一個點,或者無法做到這一點(此時輸出 \(-1\))。
解題思路:答案必然 \(\in \{-1, 1\}\)。證明如下:
用反證法。假設存在一種情況使得最優解為 \(t\) 且 \(t \ge 2\)。設第 \(t-1\) 次操作選擇點 A,則分類討論:
- 若第 \(t\) 次操作選擇點 A,則情況不會有任何變化(因為前一次操作已經清空了 A 周圍的點),與“最優解為 \(t\)”矛盾;
- 若第 \(t\) 次操作不選擇點 A,則點 A 一定不會被刪除,因為其他點到 A 的距離一定大於 \(k\),不滿足結束條件,矛盾。
綜上所述,不存在情況使得最優解為 \(t\) 且 \(t \ge 2\)。因此 \(t\in \{-1, 1\}\)。
\(O(Tn^2)\) 判斷即可。
C1 + C2
難度:普及+/提高 - 提高+/省選−
演算法標籤:構造、數學
題目描述:
有一個 \(n\) 行 \(n\) 列的井字棋棋盤,棋盤中的每一個格子要麼是空的,要麼包含一個棋子。 這裡有兩種棋子分別為 X 和 O 。如果有三個同種類的棋子連續橫著或豎著排列,則稱這是獲勝局。(注意:斜著不算) 如果棋盤中沒有這樣的連續三個同種類的排列,則稱這是一個平局。
在一次操作中,你可以將某一枚棋子替換為另一顆棋子。令 \(k\) 為初始棋盤中棋子的總數,你可以做最多 \(\lfloor\frac{k}{3}\rfloor\) 次上述操作使得最後的局面為平局。注意:你不需要最小化操作次數。
C1 與 C2 的不同在於 C2 的初始棋局中含有兩種棋子,而 C1 只有一種。
解題思路:
注意到斜線不算三連,因此考慮構造斜線。
將格子分為三種,第 \(i(i\in\{0, 1, 2\})\) 種格子的座標 \((x, y)\) 滿足 \((x+y)\%3=i\)。於是任意的橫豎三連都被拆分為三部分。由於每種格子互相不連續,因此每種格子內部可以由相同的棋子構成。於是棋盤三染色,列舉其中兩種,每次操作令兩種顏色格子上的棋子不同。由抽屜原理可知答案合法。
D
難度:普及+/提高
題目描述:
給定長度為 \(n\) 的序列 \(a\) 和正整數 \(k\),以如下方式生成 \(b\):
給定 \(a\),求有哪些 \(1 \le k \le n\),使得生成的 \(b\) 是一個排列。
解題思路:
\(k=1\) 或 \(n-1\) 時特判。
不難發現對於 \(k=n-1\),當 \(1\) 和 \(2\) 分別位於整個 \(a\) 的兩頭才合法。
對於 \(k=n-2\),同樣要求 \(1\) 在序列頭部和尾部之一,而 \(2\) 需要在序列去除 \(1\) 後的部分的頭圍之一;
對於 \(k\in[2, n-3]\),同理可得:每次遞迴地判斷當前數字在剩餘區間內是否在頭尾。
另外注意到:當 \(k(k > 2)\) 不合法時,\(k-1\) 也不合法。
因此有分類討論:對於 \(k=1\) 特判,對於 \(k>1\) 遞迴求解。
E
難度:省選/NOI−(個人感覺評高了)
演算法標籤:差分約束、圖論
題目描述:
整個社會可以用一張由 \(n\) 個頂點和 \(m\) 條邊組成的無向聯通圖來表示。頂點代表人,一條邊 \((i,j)\) 代表人 \(i\) 和 \(j\) 之間的友誼。
在社會上,第 \(i\) 個人有收入 \(a_i\)。一個人 \(i\) 羨慕一個人 \(j\),等價於 \(j\) 比 \(i\) 多出1個單位的收入,也就是 \(a_j=a_i+1\)。
如果對於每一對朋友,都有一個人羨慕另一個人,這個社會就叫資本主義社會。對於一些朋友關係,你知道哪個人在羨慕另一個人。對於其餘的朋友關係,你不知道誰羨慕誰。
社會收入不等值的定義是:\(\max_{i=1}^na_i - \min_{i=1}^na_i\),也就是社會中收入最多的人的收入與收入最少的人的收入之差。
你只知道一些朋友關係,不知道每個人的收入。對於一部分朋友關係,你知道誰羨慕誰;對於另外一部分,你不知道。你要判斷這個社會是否可能成為資本主義社會。如果是,你要構造一個 \(a\) 滿足所有條件,且這是個資本主義社會。要求你給出的 \(a\) 讓社會收入不等值最大。
解題思路:
不難發現當圖中有奇環時無解。而當圖中沒有奇環時可以轉換為差分約束。此時可以跑 Floyd 然後找到極差最大的那一組解。所以直接做就做完了。
F
難度:省選/NOI−