Codeforces Round #598 (Div. 3) B Minimize the Permutation

思路题

题意:

1--n中的数任意排列的序列,我们可以交换相连的两个数,但是我们交换的次数最多n-1次,而且每个位置只能交换一次,求这个序列最小的字典序

思路:

由于限制条件,我们最多交换n-1次,我们先从后往前交换,把交换的位置做标记,然后再从前往后交换,这样的顺序方便实现空位置的交换

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn],vis[maxn];
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        //int id=n;
        //int cnt=0;
        for(int i=n-1; i>=1; i--)
        {
            if(a[i]>a[i+1])
            {
                swap(a[i],a[i+1]);
                vis[i]=1;
            }
        }
        for(int i=1; i<n; i++)
        {
            if(!vis[i])
            {
                if(a[i]>a[i+1])
                {
                   swap(a[i],a[i+1]);
                }
            }
        }
        for(int i=1; i<=n; i++)
        {
            if(i!=n)
                printf("%d ",a[i]);
            else
                printf("%d\n",a[i]);
        }
        //printf("\n");
    }

}
发布了205 篇原创文章 · 获赞 12 · 访问量 8494

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/104039813