codeforces 1102D Balanced Ternary String(贪心+思维)

https://codeforces.com/contest/1102/problem/D

主要是满足字典序最小的时候。

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
typedef long long ll;

int main(){
    char s[300005];
    int n,sum[3];
    while(~scanf("%d",&n)){
        scanf("%s",s);
        sum[0] = 0,sum[1] = 0,sum[2] = 0;
        for(int i=0;i<n;i++){
            if(s[i] == '0')
                sum[0]++;
            else if(s[i] == '1')
                sum[1]++;
            else
                sum[2]++;
        }
        int k=0;
        if(sum[2] <= n/3)
        {
        if(sum[1]<n/3){//当1不足,2不足的时候,倒着先放2
        for(int i=n-1;i>=0;i--){
            if(sum[s[i]-'0']>n/3){
                for(int j=2;j>=1;j--){
                    if(sum[j]<n/3){
                        sum[j]++;
                        sum[s[i]-'0']--;
                        s[i] = j+'0';
                        break;
                    }
                }
            }
        }
        }
        else{//当2不足,1足的时候,先倒着放2,2放完了,再顺着放0
            for(int i=n-1;i>=0;i--){
            if(sum[s[i]-'0']>n/3){
                for(int j=2;j>=2;j--){
                    if(sum[j]<n/3){
                        sum[j]++;
                        sum[s[i]-'0']--;
                        s[i] = j+'0';
                        break;
                    }
                }
                if(sum[2] == n/3)
                {
                    k=i;
                    break;
                }
            }
        }
        }
        for(int i=0;i<k;i++){
            if(sum[s[i]-'0']>n/3){
                    for(int j=0;j<=1;j++){
                    if(sum[j]<n/3){
                        sum[j]++;
                        sum[s[i]-'0']--;
                        s[i] = j+'0';
                        break;
                    }
                }
            }
        }
        }
        else {//当2足,0也足的时候
            if(sum[0]>n/3){
             for(int i=0;i<n;i++){//先顺着把2改了再倒着把0改了
                    if(s[i] == '2'){
                        s[i]='1';
                        sum[1]++;
                        sum[2]--;
                    }
                    if(sum[2] == n/3)
                        break;
             }
             for(int i=n-1;i>=0;i--){
                if(s[i] == '0')
                {
                    s[i]='1';
                    sum[1]++;
                    sum[0]--;
                }
                if(sum[1] == n/3)
                    break;
             }
        }
        else//当2足,0不足的时候,顺着放01就好了
        {
            for(int i=0;i<n;i++){
            if(sum[s[i]-'0']>n/3){
                for(int j=0;j<=1;j++){
                    if(sum[j]<n/3){
                        sum[j]++;
                        sum[s[i]-'0']--;
                        s[i] = j+'0';
                        break;
                    }
                }
            }
        }
        }
        }
        printf("%s\n",s);
    }
    return 0;
}

 

  

 

posted on 2019-05-21 16:44  一只小毛球  阅读(194)  评论(0编辑  收藏  举报

导航