思路:模拟next_permutation函数(也可能这是next_permutation的实现)。
①找到最后一个满足a[i]<a[i+1]的i,记为minpos=i;
②找到最后一个满足a[j]>a[minpos]的j,记为maxpos=j;
③把a[minpos]和a[maxpos]交换过来;
④把a[minpos+1~n]的数从小到大排序;
对于本题,将给定序列进行m次模拟即可,时间复杂度为O(n*m)。(当然也可以直接用STL水过去。。。)
AC Code:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=10000+100; int a[N]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++){ int maxpos,minpos; for(int j=n-1;j;j--) { if(a[j]<a[j+1]) { minpos=j;break; } } for(int j=n;j>=minpos;j--){ if(a[j]>a[minpos]){ maxpos=j;break; } } int t=a[maxpos];a[maxpos]=a[minpos];a[minpos]=t; reverse(a+minpos+1,a+n+1); } for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }