Codeforces 1256B. Minimize the Permutation 贪心 STL

题意:给出一个排列,可以且仅可以对排列中某个位置相邻元素进行一次操作,该操作交换两元素位置,求出在进行操作后可以得到的最小字典序的排列
思路:水题,算是对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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值