在比赛的时候,第一题很顺利的过了,但是到第二题就有点抢时间,没注意读题,导致卡了很久,影响了后面本来能a的题。所以,无论前期怎么样,都该稳住心态。
题目大意:给你n个数的序列(1~n)。有n-1种操作,操作n-1就是把a[n-1]与a[n]交换位置。每种操作至多只能使用一次。求字典序最小排列。比如 {1,2,3,5,4}>{1,2,3,4,5};
解题思路:要想找到最小序列,很显然要将小的数尽可能的向左移动。一个序列最小的状况是呈递增的。举个例子,5 4 3 1 2,第一步找到最小的数1,向做移动到位置1,第二步找到除1外最小的数2,向左移动,但是第一步已经使用掉了,操作1、2、3。所以对于数2,我们只能通过操作4将数2移动到位置4而不能移动到位置2。所以,我们只需要记录每次操作最小数的位置,每次找最小数都是在上次最小数的位置到n这个区间去找。
#include <bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int q;
scanf("%d",&q);
while(q--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int np=1,lp=1;
while(np<=n){
//cout<<1<<endl;
lp=np;
for(int i=np;i<=n;i++){
if(a[np]>a[i]){
np=i;
}
}
if(np==lp){np++;continue;}
for(int i=np-1;i>=lp;i--){
swap(a[i],a[i+1]);
}
//cout<<np<<endl;
}
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n");
}
return 0;
}