Educational Codeforces Round 47 (Rated for Div. 2) B - Minimum Ternary String(思维)

原题链接:传送门

题意:给你一个字符串,这个字符串是一个只包含字符’ 0 ‘,’ 1 ‘和’ 2 ’ 的字符串。你可以交换任意两个相邻的字符如’0’和’1’、’1’和’2’,而’0’和’2’则不能交换。你需要通过交换任意次数来获得最小可能(按字典排序)的字符串。并将这个字符串打印出来。

由于’1’类似一个中介的字符——可以与’0’、’2’交换,这里我们可以先找出第一个’2’的位置,将’2’之前的’0’放在最前面,再把所有的’1’都放在第一个’2’前面,然后再判断第一个’2’后面的所以字符。


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int main(){
    string str;
    cin>>str;
    int len = str.length();
    int num0 = 0, num1 = 0, flag = 0 ,pos = len;    //pos记录第一个'2'的位置,将其初始化为字符长度后一位 
    for(int i=0;i<len;i++){     
        if(str[i] == '0' && flag == 0){     //找第一个'2'之前的'0'的个数 
            num0 ++;
        }
        else if(str[i] == '1'){     //'1'的全部数目 
            num1 ++;
        }
        else if(str[i] == '2' && flag == 0){    //找到第一个'2'将其标记 
            flag = 1;
            pos = i;
        }
    }
    for(int i=0;i<num0;i++)
        printf("0");
    for(int i=0;i<num1;i++)
        printf("1");

    while(pos < len){       //第一个'2'之后的 
        if(str[pos] != '1')
            printf("%c",str[pos]);
        pos ++;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_16554583/article/details/81053232