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

      

     

  • 相关阅读:
    P3133 [USACO16JAN]无线电联系Radio Contact
    P2196 挖地雷
    P2434 [SDOI2005]区间
    P2820 局域网
    P2904 [USACO08MAR]跨河River Crossing
    P1586 四方定理
    P2983 [USACO10FEB]购买巧克力Chocolate Buying
    P2049 魔术棋子
    kali-linux破解密码运行脚本并隐藏进程
    kali安装使用
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/10900729.html
Copyright © 2011-2022 走看看