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;
}