Balanced Ternary String

给出一个长为n的只由'1','2','0'组成的字符串,要求改动最少的位置,使'1','2','0'的个数相同(保证n能被3整除),并使改动后的字符串字典序最小。

n不大于3∗105

贪心思路,从左向右大的变小的,从右向左小的变大的:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s,ss;
int res,n,x,num1,num0,num2;
int main()
{
    cin>>n>>s;
    ss=s;
    x=n/3;
    for(int i=0;i<n;i++){
        if(s[i]=='0') num0++;
        else if(s[i]=='1') num1++;
        else if(s[i]=='2') num2++;
    }
    if(num2>x){
        if(num0<x&&num2>x)
            for(int i=0;i<n;i++){
                if(num2>x&&num0<x&&s[i]=='2') s[i]='0',num2--,num0++;
                if(num0==x||num2==x) break;
            }        
        if(num1<x&&num2>x)
            for(int i=0;i<n;i++){
                if(num2>x&&num1<x&&s[i]=='2') s[i]='1',num2--,num1++;
                if(num1==x||num2==x) break;
            }        
    }    
    if(num1>x){
        if(num0<x&&num1>x)
            for(int i=0;i<n;i++){
                if(num1>x&&num0<x&&s[i]=='1') s[i]='0',num1--,num0++;
                if(num0==x||num1==x) break;
            }
        if(num2<x&&num1>x)
            for(int i=n-1;i>=0;i--){
                if(num1>x&&num2<x&&s[i]=='1') s[i]='2',num1--,num2++;
                if(num2==x||num1==x) break;
            }
    }    
    if(num0>x){
        for(int i=n-1;i>=0;i--){
            if(num0>x&&s[i]=='0'){
                if(num2<x) s[i]='2',num2++,num0--;
                else if(num1<x) s[i]='1',num1++,num0--;
            }
        }
    }
    cout<<s;
    return 0;
}

 

posted @ 2023-06-13 11:38  o-Sakurajimamai-o  阅读(23)  评论(0)    收藏  举报
-- --