CF598 div3 B.Minimize the Permutation(贪心)

在这里插入图片描述
题目意思:就是有n个数,然后每个位子都有一次和上一个位子换一下数字的机会(当然第一位就肯定不可以)。所以n个数字一共能换n-1次。然后问至多按这个规则交换的话,能生成的最小字典序的排序是多少?
解题思路:首先肯定是贪心,因为要生成字典序最小么,所以尽可能把小的排在前面。
其实挺简单的,不知道为啥,脑子抽了,还卡了一段时间。
用一个a数组来记录给的数字序列,然后我用loc数组记录了每个数字的位置。然后是贪心么,所以上一个数字排完以后,肯定是从上一个数字的初始位置开始向后找一个剩余的里最小的。再把它尽量往前排,直到前面的数比他小,就停下来。

#include <bits/stdc++.h>
int a[105];
int n;
int loc[105];
int q;
using namespace std;

int main()
{
    
    
    scanf("%d",&q);
    while(q--){
    
    
       scanf("%d",&n);
       memset(a,0,sizeof(a));
       memset(loc,0,sizeof(loc));
       for(int i=1;i<=n;++i){
    
    
        scanf("%d",&a[i]);
        loc[a[i]]=i;
       }
       int j=1;
       int k;
       for(int i=1;i<=n;){
    
    //i记录了上个数字的初始位置
         for(k=loc[j];k>i;k--){
    
    
            if(a[k]>a[k-1]) break;
            swap(a[k],a[k-1]);
         }
        for(k=j+1;k<=n;++k) if(loc[k]>loc[j]){
    
    i=loc[j];j=k;break;}
        if(k>=n) break;
       }
       for(int m=1;m<n;++m) printf("%d ",a[m]);
       printf("%d\n",a[n]);

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43329358/article/details/102964639
今日推荐