zoukankan      html  css  js  c++  java
  • 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
    ",s);
        }
        return 0;
    }
    

      

     

  • 相关阅读:
    js数组和数组去重的几种简单的方法
    nodejs项目的model操作mongo
    canvas画布
    bson
    神奇的东西
    sql与nosql
    mong大牛的blog
    mongo 增删改查
    Mongo配置基础
    session放数据库里解决丢失的问题
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/10900729.html
Copyright © 2011-2022 走看看