Codeforces 🟠 CF2053A. Tender Carpenter
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 CF2053A Tender Carpenter
Problem Statement
題目簡述
給定一個長度為 的陣列 。
定義一個整數集合 是 穩定 的,當且僅當從 中任意選取三個元素 (可以重複選取),都能構成一個非退化三角形(即滿足三角不等式)。
題目要求將陣列 劃分為若干個連續的非空子段,使得每個子段內的元素構成的集合都是 穩定 的。
判斷是否存在 至少兩種 不同的劃分方式。
Constraints
約束條件
思路:貪心
題目要求判斷是否可以將陣列 劃分成至少兩種不同的「穩定」子段方案。
觀察一:恆存在一種劃分方案
將每個元素 單獨作為一個子段,這種劃分方式總是有效的。
原因
對於單一元素 ,從集合 中選取三個元素只能是 。由於 ,顯然 成立,故單元素集合必定穩定。
因此,問題轉化為:是否存在第二種有效的劃分方式?這意味著至少需要有一個長度大於 的子段是穩定的。
觀察二:穩定集合的子集仍然穩定
若集合 是穩定的,則對於任意非空子集 , 也是穩定的。
證明
若存在 使得 無法構成三角形,由於 ,則 ,這與 穩定矛盾。
根據觀察二,若存在一個長度 的穩定子段,我們總可以將其拆分為更小的子段,直到只剩下一個長度為 的穩定子段。因此,問題進一步簡化為:
二元集合的穩定條件
對於集合 (允許重複選取),我們需要檢驗所有可能的三元組:
| 組合 | 條件 | 結論 |
|---|---|---|
| 恆成立 | ||
| 恆成立 | ||
| 需滿足 | ||
| 需滿足 |
綜合以上條件, 穩定 。
因此,我們只需遍歷陣列,檢查是否存在相鄰的一對元素 滿足上述條件。若存在,即可將這兩個元素合併為一個子段,其餘元素單獨劃分,從而得到第二種劃分方案。
複雜度分析
- 時間複雜度:,只需要遍歷一次陣列。
- 空間複雜度:,用於存儲輸入陣列。
Code
1 | from itertools import pairwise |
寫在最後
PROMPT
這裡什麼都沒有。
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus








