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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值