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 成文