【思维】0,1,2最小串

CodeForces 1009B Minimum Ternary String

题意:

输入一串数,0与1可以互换,1与2可以互换,将这串数换成等长最小的数。

题解:

1可以和另外两种数都换位,记录1的个数,

有2就将1全部放在第一个2之前,以求2尽量靠后,2与0相对位置不变;

没有2就将1放在末尾,让所有0靠前;

注意可以将201换成120。

#include<cstdio>
using namespace std;
int main()
{
    char s[N];
    int n=0,n1=0,n2=0;;
    while(scanf("%c",&s[n])&&s[n]!='\n'){
        if(s[n]=='1')n1++;
        if(s[n]=='2')n2++;
        n++;
    }
    bool ok=true;
    for(int i=0;i<n;i++){
        if(ok&&s[i]=='2'){
            for(int j=0;j<n1;j++)printf("1");
            ok=false;
        }
        if(s[i]!='1')
            printf("%c",s[i]);
    }
    if(ok)for(int j=0;j<n1;j++)printf("1");
    printf("\n");
}

猜你喜欢

转载自blog.csdn.net/synlhr/article/details/81185140