CF1009B Minimum Ternary String

CF1009B Minimum Ternary String

洛谷传送门

题目描述

给定一个由 '0', '1', '2' 组成的字符串 SSS 。可以交换相邻'0', '1'或'1', '2'的位置(例如:'12' - '21'   ; '01' - '10')请输出原字符串经过任意转换后字典序最小的字符串。原字符串长度不超过 10510^5105 。

输入格式

字符串 SSS


题解:

一看就是推性质的题。要说是贪心其实也可以。

0要靠前,1尽可能在2前面,2靠后。

然后看怎么移动。

发现如果2后面有0,这个0打死也动不到这个2的前面,因为到后面就截止了。

发现1非常自由,可以到序列的任何一个位置。

那么贪心思路就是:保留0、2,把所有的1放到第一个2的前面。

有这个思路就好办了。

剩下的是一些细节。

代码:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
char a[maxn];
bool flag;
int pos,cnt;
int main()
{
    scanf("%s",a+1);
    int len=strlen(a+1);
    for(int i=1;a[i];i++)
    {
        if(a[i]=='1')
            cnt++;
        if(a[i]=='2'&&!flag)
        {
            flag=1;
            pos=i;
        }
    }
    if(cnt==len)
    {
        for(int i=1;a[i];i++)
            printf("%c",a[i]);
        return 0;
    }
    for(int i=1;a[i];i++)
    {
        if(a[i]=='1')
            continue;
        else if(i==pos)
            for(int j=1;j<=cnt;j++)
                printf("1");
        printf("%c",a[i]);
    }
    if(!pos)
        for(int j=1;j<=cnt;j++)
                printf("1");
    return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/14012409.html