T3 小信的平衡字符串 Wa0pts 求调

T3 小信的平衡字符串

#include<bits/stdc++.h>
using namespace std;
long long n,sum0,sum1,sum2;
string s;
int main() 
{

    cin>>n;
    cin>>s;
    for(long long i=0;i<n;i++)
    {
        if(s[i]=='0')
        {
            sum0++;
        }
        if(s[i]=='1') 
        {
            sum1++;
        }
        if(s[i]=='2')
        {
            sum2++;
        }
    }
    long long mb=n/3;
    for(long long i=0;i<n;i++) 
    {
        if(s[i]=='2'&&sum2>mb) 
        {
            if(sum0<mb) 
            {
                s[i]='0';
                sum2--;
                sum0++;
            }
            else if(sum1<mb) 
            {
                s[i]='1'; 
                sum2--;
                sum1++;
            }
        }
        else if(s[i]=='1'&&sum1>mb) 
        {
            if(sum0<mb)
            {
                s[i]='0';
                sum1--;
                sum0++;
            } 
            else if(sum2<mb) 
            {
                s[i+mb]='2';
                sum1--;
                sum2++;
            }
        }         
        else if(s[i]=='0'&&sum0>mb) 
        {
            if(sum1<mb) 
            {
                s[i+mb]='1';
                sum0--;
                sum1++;
            } 
            else if(sum2<mb) 
            {
                s[i]='2';
                sum0--;
                sum2++;
            }
        } 
    }
    cout<<s;
    return 0;
} 

你这个思路错了吧
我没看出你这个代码哪里能保证改变次数最少
221111110000000
字符串长这样你不就炸了么

没炸

???
输入长这样:221111110000000
输出长这样:221111122200000
正确输出长这样:221111200000022

我理解错了,确实

换个思路继续写

总结

AC了方案给我呗OvO

思路给一个
首先,因为有3个数字,所以就3种情况:
1.3个数字的数量都=n/3,直接输出原字符串
2.1个数字=n/3,另外两个一高一低
方法:把高的那个数字改成低的那个数字,如果低的那个数字比高的那个数字字典序大,那么就改序列靠的
位置,否则就改靠前的
3.都不等于n/3
1.一个大于n/3,两个小于
方法:把大于那个数字改成两个小于的,仍然考虑字典序,方法上同
2.一个小于n/3,两个大于
方法:上同
快点写啊QAQ
我想要方案QAQ