Educational Codeforces Round 47 (Rated for Div. 2) B.Minimum Ternary String(思维)


题目链接:http://codeforces.com/contest/1009/problem/B

       题意是给了只含有0,1,2的字符串,然后可以给字符换位置,0可以和1换位,1可以和2换位,但是0和2不能换位置,最后让你输出字典序最小的字符串。

       思路是因为1能和0换位置,也能和2换位置,所有1可以移到所有2的前面,而在第一个2之前的0都可以移到最左边,所以按照这一点我们可以先找到第一个2的位置,然后将第一个2之前的0都输出出来,因为1是可以随便移动的,所以在将第一个2之前的0都输出出来后可以把所有的1都输出出来,最后在第一个2的后面除了1其他的按原样输出就好了。需要注意的是因为有可能字符串里没有2,所以用来标记第一个2的位置的变量flag应该初始化为大于等于len的值。


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string str;

int main()
{
  cin>>str;
  int len = str.length();
  int sum = 0;
  int a0 = 0,a1 = 0;
  int flag = len;
  for(int i=0;i<len;i++){
    if(str[i] == '1'){
      a1 ++;
    }
    if(str[i] == '0' && flag == len){
      a0 ++;
    }
    if(str[i] == '2' && flag == len){
      flag = i;
    }
  }
  for(int i=0;i<a0;i++)cout<<"0";
  for(int i=0;i<a1;i++)cout<<"1";
  for(int i=flag;i<len;i++){
    if(str[i] != '1')cout<<str[i];
  }
  cout<<endl;
  return 0;
}

猜你喜欢

转载自blog.csdn.net/charles_zaqdt/article/details/81062854