P1088 火星人 - 全排列

传送门


思路:模拟next_permutation函数(也可能这是next_permutation的实现)。

①找到最后一个满足a[i]

②找到最后一个满足a[j]>a[minpos]的j,记为maxpos=j;

③把a[minpos]和a[maxpos]交换过来;

④把a[minpos+1~n]的数从小到大排序;

对于本题,将给定序列进行m次模拟即可,时间复杂度为O(n*m)。(当然也可以直接用STL水过去。。。)


 

AC Code:

#include
#include
#include
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]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;
}

 

转载于:https://www.cnblogs.com/Loi-Brilliant/p/9461036.html

你可能感兴趣的:(P1088 火星人 - 全排列)