题目链接:Acwing 420.火星人
算法思路:从右往左扫描数组,找到第一个a[k-1]<a[k]
的位置k
,然后在k
到n
的范围内找到比a[k-1]
大的最小的数,记为a[t]
,将a[k-1]
和a[t]
交换,最后将数组的k
到n
的一段逆序
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
while(m--){
int k=n;
while(a[k-1]>a[k]) k--;
//此时a[k-1]<a[k]
int t=k;
while(a[t]>a[k-1]) t++;
t--;
swap(a[t],a[k-1]);
reverse(a+k,a+n+1);
}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}