cf B. Minimum Ternary String

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]!='\0';i++)
    {
        if(s[i]=='1') num1++;
    }
    for(int i=0;s[i]!='\0';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;

}


猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/81061801