Codeforces 250 題目分析

cakn發表於2024-11-18

附註 \(1\):由於 Codeforces 伺服器故障,本題的程式時限標稱二分之一
附註 \(2\):若難度標記為形如 XXX/YYY 的格式且斜線前後顏色不同,則前者為作者估計,後者為洛谷標註。(吐槽:洛谷很多題目難度虛高)

題目

Dashboard

題目分析

A

難度:入門 / 普及−
演算法標籤:貪心
題目大意:給你 \(n\) 個數,然後你分成若干個子序列,要求每個子序列至多有 \(2\) 個負數,求最少的子序列數。
題解:每個子序列分 \(2\) 個負數即為正解。讀者自證不難。

B

難度:普及− / 普及/提高−
演算法標籤:模擬
題目大意:給定若干組 IPv6 地址的縮略形式,求這些地址的完整形式。
題解:字串處理。
IPv6 的地址縮寫(基本上)遵循兩條原則:

  1. 省略前導 \(0\)
  2. 連續的 \(0000\) 串用 :: 代替(如 1234:5678:0000:0000:0000:0000:0938:0000\(\rightarrow\)1234:5678::938:0),且保證 :: 符號最多出現一次;
  3. 特別的,0000:0000:0000:0000:0000:0000:0000:0000\(\rightarrow\)::

因此這樣處理:遍歷字串,判斷每“節”(即相鄰 : 及頭尾之間的內容)字元數,缺的補全。若某節中沒有字元則判斷長度後全部輸出 \(0\)

\(1.5\) 倍經驗:洛谷 P2815

C

難度:普及/提高−
演算法標籤:貪心
題目大意:

給出一個長度為 \(n\) 的序列,序列僅包含 \(1\)\(k\) 的數字,且對於每個數字,在序列中的出現次數至少為一次。
現在請你選出一個數字,使刪去數列中所有的這個數字後,相鄰位置的數字是不同的個數最小。
如果答案有多個,請輸出最小的一個。

題解:不難發現形如 xxxxx 的子串對答案的貢獻和 x 是一樣的。然後直接做就做完了。

D

難度:普及+/提高
演算法標籤:幾何、三分、雙指標
題目大意:

現在有 \(n\) 個點 \(A_i=(a,y_i)\)\(m\) 個點 \(B_i=(b,y_i')\),點 \(O=(0,0)\)
定義 \(|XY|\)\(X,Y\) 兩點間歐幾里得距離,最小化 \(min_{i=1}^{n}min_{j=1}^{m}(|OA_i|+|A_iB_j|+l_j)\),求對應的 \(i\)\(j\)

題解:暴力的複雜度是 \(O(nm)\) 的。因此考慮最佳化。
不難發現排序後,當 \(j\) 是一個常數時,\(f(i)=|OA_i|+|A_iB_j|+l_j\) 是一個單谷函式。於是可以三分。
時間複雜度 \(O(m \text{log}_3n)\),可以透過這道題。

E

難度:普及+/提高
演算法標籤:暴力(?)
題目大意:

給一個怪物,然後它一開始看著右邊,每一秒它會做出如下行動:

  • 如果它的下面是空著的,那麼它就掉下去。特別注意它的視角不變,也就是說它一開始向右看,那麼掉下去也向右看。
  • 否則它就往視線的方向走,如果碰到 + 它會破壞掉,然後轉視角;如果是 # 那麼它破壞不了,但它依然會換視角。
    每個操作可以看成 \(1\) 秒之內完成的。求出它下到 \(1\) 樓的時間。
    image

題解:暴力 \(O(nm^2)\) 的會 T。可以看出某些時候它可能會重複走走過的路線。那麼這種情況下考慮跳過空區間。這樣複雜度就降為 \(O(nm)\) 就過了。

相關文章