题目链接:http://codeforces.com/contest/1009/problem/B
题意是给了只含有0,1,2的字符串,然后可以给字符换位置,0可以和1换位,1可以和2换位,但是0和2不能换位置,最后让你输出字典序最小的字符串。
思路是因为1能和0换位置,也能和2换位置,所有1可以移到所有2的前面,而在第一个2之前的0都可以移到最左边,所以按照这一点我们可以先找到第一个2的位置,然后将第一个2之前的0都输出出来,因为1是可以随便移动的,所以在将第一个2之前的0都输出出来后可以把所有的1都输出出来,最后在第一个2的后面除了1其他的按原样输出就好了。需要注意的是因为有可能字符串里没有2,所以用来标记第一个2的位置的变量flag应该初始化为大于等于len的值。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string str;
int main()
{
cin>>str;
int len = str.length();
int sum = 0;
int a0 = 0,a1 = 0;
int flag = len;
for(int i=0;i<len;i++){
if(str[i] == '1'){
a1 ++;
}
if(str[i] == '0' && flag == len){
a0 ++;
}
if(str[i] == '2' && flag == len){
flag = i;
}
}
for(int i=0;i<a0;i++)cout<<"0";
for(int i=0;i<a1;i++)cout<<"1";
for(int i=flag;i<len;i++){
if(str[i] != '1')cout<<str[i];
}
cout<<endl;
return 0;
}