P1088 火星人 - 全排列

传送门


思路:模拟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;
}

猜你喜欢

转载自www.cnblogs.com/Loi-Brilliant/p/9461036.html
今日推荐