CodeForces - 1009B Minimum Ternary String
题意:
给你一串由0 1 2组成的字符串,相邻的 0 和 1 可以交换位置,相邻的 1 和 2 可以交换位置,输出最小的字符串 。
思路:
由题意可知 1 可以和 0 或 2 互换,所以 1 可以在字符串中任意移动。从第一个 2 后边的 0 开始,0 与 2 的相对位置保持不变。
第一个 2 前边的 0 都交换到开头。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
char s[maxn],str[maxn];
int main()
{
scanf("%s",&s);
int n = strlen(s);
int sum = 0; // 第一个2 前边0 的个数
int sum1 = 0; // 1 的个数
int k = 0,flag = 0;
for(int i=0;i<n;i++)
{
if(s[i]=='0' && flag==0)
sum++;
else if(s[i]=='0' && flag==1)
str[k++] = s[i];
else if(s[i]=='1')
sum1++;
else if(s[i]=='2')
{
flag = 1;
str[k++] = s[i];
}
}
for(int i=0;i<sum;i++)
printf("0");
for(int i=0;i<sum1;i++)
printf("1");
printf("%s\n",str);
return 0;
}