题目链接:https://codeforces.com/problemset/problem/1009/B
题目要求相邻的1、2和相邻的0、1可以交换,但0、2不可交换。1作为承上启下的元素,可以在串中自由滑动,第一个2出现后将会把之后的0挡在后面。综上我们要求出串中1的个数,第一个2的位置,和第一个2之前0的个数。先输出第一个2之前0的个数,在输出所有的1,再从第一个2的位置起进行遍历,遇到1跳过,其他输出。(真是一道好思维题)(当时真是想不出来啊)(仍需努力)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[100010];
while(cin>>s)
{
int s0=0,s1=0,pos=-1,flag=0; //计算串中所有1的个数,第一个2前面0的个数,第一个2的位置
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='1')
s1++;
if(s[i]=='2'&&flag==0)
{
pos=i,flag=1;
}
if(s[i]=='0'&&flag==0)
s0++;
}
for(int i=0;i<s0;i++)
cout<<"0";
for(int i=0;i<s1;i++)
cout<<"1";
if(pos!=-1)
{
for(int i=pos;i<len;i++)
{
if(s[i]=='1')
continue;
cout<<s[i];
}
}
cout<<endl;
}
return 0;
}