题意:给出一个排列,可以且仅可以对排列中某个位置相邻元素进行一次操作,该操作交换两元素位置,求出在进行操作后可以得到的最小字典序的排列
思路:水题,算是对STL的应用,主要是太久没有碰代码了,手痒的不行。因为不管怎么交换只要最小的元素在最前面就行,首先1肯定是在首位,这样原来1位置之前的所有元素都需要交换一次,记录下当前已交换的元素位置,找出后面还没交换过的最小的元素,将其尽量放到前面,直到所有元素都已交换或者最小元素排在最后算法结束
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 4e5+10;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
int q, n, a[maxn];
int main()
{
cin >> q;
while (q--) {
cin >> n;
int pos = 0;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
while (pos < n) {
int p = min_element(a.begin()+pos, a.end())-a.begin();
int t = a[p];
a.erase(a.begin()+p);
a.insert(a.begin()+pos, t);
if (pos == p) pos = p+1;
else pos = p;
}
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
cout << "\n";
}
return 0;
}