CF1256B - Minimize the Permutation(贪心+排序+暴力+提高级)

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

Problem

tag:

⇔贪心、⇔排序、⇔暴力、⇔提高级(*1400)

题意:

对于给定的全排列,至多进行 \(n - 1\) 次操作,使得最终结果的字典序最小。操作规则如下:

  • 每次操作可以交换位于 \(i\)\(i - 1\) 位置的元素。
  • 每个操作至多进行一次。

思路:

(朱老师)带限制的冒泡排序。

(自己)其实一开始做这题的时候,读题出现了问题,没有注意到“每个操作至多进行一次”这个条件,导致题目想了好久好久,还WA了一次。重新读题后个人理解:暴力,按照元素从小到大,依次向前进行冒泡排序;限制1,使用 flag[i] 数组标记 \(i\) 位置是否被操作过;限制2,使用 num 变量标记一共进行了多少次循环。

AC代码(伪代码):

ms(flag, true);
cin >> n;
FOR(i, 1, n) cin >> 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.18 修改部分格式
2021.12.17 成文


posted @ 2021-12-17 23:16  hh2048  阅读(60)  评论(0编辑  收藏  举报