1. 程式人生 > 其它 >CF1256B - Minimize the Permutation(貪心+排序+暴力+提高階)

CF1256B - Minimize the Permutation(貪心+排序+暴力+提高階)

2021.12.08 隊內賽第一題

CF1256B - Minimize the Permutation(源地址自⇔CF1256B

目錄

Problem

tag:

⇔貪心、⇔排序、⇔暴力、⇔提高階(*1400)

題意:

對於給定的全排列,至多進行 \(n - 1\) 次操作,使得最終結果的字典序最小。操作規則如下:

  • 每次操作可以交換位於 \(i\)\(i - 1\) 位置的元素。
  • 每個操作至多進行一次。

思路:

(朱老師)帶限制的氣泡排序。

(自己)其實一開始做這題的時候,讀題出現了問題,沒有注意到“每個操作至多進行一次”這個條件,導致題目想了好久好久,還WA了一次。重新讀題後個人理解:暴力,按照元素從小到大,依次向前進行氣泡排序;限制1,使用 flag[i]

陣列標記 \(i\) 位置是否被操作過;限制2,使用 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 成文