题目意思:就是有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;
}