$朴素写法:$
$1.从后往前遍历,找到第一个小于后一个数的位置k$
$2.从该位置开始往后遍历,找到比该数大的最小的数的位置t$
$3.交换两个数的位置:swap(a[t], a[k]),交换后,数组尾部为单调递减序列$
$4.将第k的位置及其之后的位置逆转$
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e4+10;
int a[N];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 0;i < n;i ++) cin >> a[i];
while(m --)
{
int k = n - 2;
while(a[k] > a[k+1]) k --;
int t = k + 1;
while(t < n && a[t + 1] > a[k]) t ++;
swap(a[k],a[t]);
reverse(a + k + 1, a + n);
}
for(int i = 0;i < n; i ++) cout << a[i] << ' ';
cout << endl;
return 0;
}