http://codeforces.com/contest/1009/problem/B
题目大意就是给你一个仅由'0','1','2'组成的字符串,然后有2种变换方式,一种是0和1交换位置,另一种是1和2交换位置。问经过任意次的变化得到的字典序最小的字符串。
题解:因为1可以和0交换位置,1又可以和2交换位置,所以1可以变换到任意的位置,而0和2不能交换,就相当于是0和2的相对位置是不能改变的,比如说有个字符串012010,不管这2个1换到哪里,第一个0永远在第一个2前面,第二个和第三个0永远在第一个2的后面。为了令字典序最小就要使0尽可能放最前面,1尽可能放中间,2尽可能放最后面,那就从把字符串从头到尾扫一遍,遇到1跳过,遇到0输出,遇到第一个2就把字符串全部的1输出,然后此时第一个2后面就没有1了,只有0和2存在了,然后因为0,2不能交换,所以直接输出
#include<bits/stdc++.h>
using namespace std;
char s[100005];
int main()
{
int num1=0,flag=0;
cin>>s;
for(int i=0;s[i]!=' ';i++)
{
if(s[i]=='1') num1++;
}
for(int i=0;s[i]!=' ';i++)
{
if(s[i]=='1') continue;
if(s[i]=='0') cout<<0;
if(s[i]=='2'&&!flag)
{
flag=1;
while(num1--) cout<<1;
cout<<2;
}
else
if(s[i]=='2'&&flag)
cout<<2;
}
if(!flag)
while(num1--)
cout<<1;
cout<<endl;
return 0;
}