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

博客提及链接https://codeforces.com/contest/1102/problem/D,主要围绕满足字典序最小的情况展开,还给出了转载链接https://www.cnblogs.com/LLLAIH/p/10900729.html 。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

 

  

 

转载于:https://www.cnblogs.com/LLLAIH/p/10900729.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值