CF1256B - Minimize the Permutation(貪心+排序+暴力+提高階)
阿新 • • 發佈:2021-12-18
2021.12.08 隊內賽第一題
陣列標記 \(i\) 位置是否被操作過;限制2,使用
CF1256B - Minimize the Permutation(源地址自⇔CF1256B)
目錄Problem
tag:
⇔貪心、⇔排序、⇔暴力、⇔提高階(*1400)
題意:
對於給定的全排列,至多進行 \(n - 1\) 次操作,使得最終結果的字典序最小。操作規則如下:
- 每次操作可以交換位於 \(i\) 和 \(i - 1\) 位置的元素。
- 每個操作至多進行一次。
思路:
(朱老師)帶限制的氣泡排序。
(自己)其實一開始做這題的時候,讀題出現了問題,沒有注意到“每個操作至多進行一次”這個條件,導致題目想了好久好久,還WA了一次。重新讀題後個人理解:暴力,按照元素從小到大,依次向前進行氣泡排序;限制1,使用 flag[i]
num
變數標記一共進行了多少次迴圈。
AC程式碼:
ms(flag, true); S(n); FOR(i, 1, n) S(a[i]); FOR(q, 1, n) { FOR(i, 1, n) { if(a[i] == q && num < n) {//find 'q' FORD(j, 2, i) {//swap the number which before the 'q' if(a[j - 1] > a[j] && flag[j - 1] == true) { swap(a[j], a[j - 1]); num ++; flag[j - 1] = false; } } } } } FOR(i, 1, n) cout << a[i] << " "; cout << endl;
錯誤次數
(隊內賽1)讀題錯誤
(隊內賽2)忘記增加冒泡條件:僅 a[j - 1] < a[j]
時才進行交換。
(補題1)讀題錯誤
文 / WIDA
2021.12.17成文
首發於WIDA個人部落格,僅供學習討論
更新日記:
2021.12.17 成文