C. Minimize The Integer(贪心)

传动门前往传送门

\(看完题解后觉得自己好蠢......\)

\(相信大部分人会先拿样例做实验\)

\(可以从前往后贪心,第一个位置只可以和后面的第一个不同类的数交换\)

\(基于这个,我们可以写出一个O(n^2)的算法\)

\(因为找后面第一个不同类的数和找到后进行冒泡交换的时间都难以优化!!\)

\(\color{Red}{但是,有时候我们只考虑结果不考虑过程,这才是贪心}\)

\(其实上面发现规律的本质是奇数向左或者向右交换都有一道鸿沟\)

\(那就是不能到上一个奇数之前,不能到下一个奇数之后,除此之外任意\)

\(\color{Orange}{那么,只需要维护最终的序列奇数相对位置不变,偶数相对位置不变}\)

\(那么每次取最前的奇数和偶数比较大小,看看哪个小直接输出\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+9;
int ou[maxn],top;
int ji[maxn],cnt;
string s;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		top=cnt=0;
		cin>>s;
		for(int i=0,l=s.length();i<l;i++)
		{
			int k=s[i]-'0';
			if(k%2==1)	ji[++cnt]=k;
			else	ou[++top]=k;
		}
		int i,j;
		for(i=1,j=1;i<=cnt&&j<=top;)
		{
			if(ou[j]<ji[i])	printf("%d",ou[j++]);
			else	printf("%d",ji[i++]);	
		}
		while(i<=cnt)	printf("%d",ji[i++]);
		while(j<=top)	printf("%d",ou[j++]);
		cout<<endl;
	}
}
posted @ 2020-05-14 10:01  倾叶子佮  阅读(172)  评论(0编辑  收藏  举报