思路
不外乎八种情况,0,1,2都大于/小于平均值这两种情况不存在,所以只有六种情况,根据字典序贪心修改一下即可
解决方案
/*
@description:
@author: universal42@163.com
@solution:
@chinese problem:
给定一个只包含0,1,2的字符串,这样的串称为三元串
改动最少次数,使0,1,2的数量相等
输出字典序最小的目标字符串
*/
#include<queue>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LOCAL
#define cls ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define Mod 998244353
#define ll long long int
#define mset(a,b) memset(a,b,sizeof(a))
#define INF 1e9
const int maxn=2e3+5;
int main() {
cls;
#ifdef LOCAL
freopen("in.in","r",stdin);
#endif // LOCAL
int n;
string s;
cin>>n>>s;
int cnt[3]={0};
int average=n/3;
for(int i=0;i<n;i++){
cnt[s[i]-'0']++;
}
if(cnt[0]>=average&&cnt[1]>=average&&cnt[2]<=average){
int a=cnt[0]-average;
int b=cnt[1]-average;
for(int i=n-1;i>=0&&(a||b);i--){
if(s[i]=='0'&&a){
s[i]='2';
a--;
}
else if(s[i]=='1'&&b){
s[i]='2';
b--;
}
}
}
else if(cnt[0]>=average&&cnt[1]<=average&&cnt[2]<=average){
int a=cnt[0]-average;
int c=average-cnt[2];
int b=average-cnt[1];
for(int i=n-1;i>=0&&c;i--){
if(s[i]=='0'){
s[i]='2';
c--;
}
}
for(int i=n-1;i>=0&&b;i--){
if(s[i]=='0'){
s[i]='1';
b--;
}
}
}
else if(cnt[0]<=average&&cnt[1]>=average&&cnt[2]<=average){
int a=average-cnt[0];
int c=average-cnt[2];
for(int i=0;i<n&&a;i++){
if(s[i]=='1'){
s[i]='0';
a--;
}
}
for(int i=n-1;i>=0&&c;i--){
if(s[i]=='1'){
s[i]='2';
c--;
}
}
}
else if(cnt[0]<=average&&cnt[1]>=average&&cnt[2]>=average){
int b=cnt[1]-average;
int c=cnt[2]-average;
for(int i=0;i<n&&(b||c);i++){
if(s[i]=='1'&&b){
s[i]='0';
b--;
}
else if(s[i]=='2'&&c){
s[i]='0';
c--;
}
}
}
else if(cnt[0]<=average&&cnt[1]<=average&&cnt[2]>=average){
int a=average-cnt[0];
int b=average-cnt[1];
for(int i=0;i<n&&a;i++){
if(s[i]=='2'){
s[i]='0';
a--;
}
}
for(int i=0;i<n&&b;i++){
if(s[i]=='2'){
s[i]='1';
b--;
}
}
}
else if(cnt[0]>=average&&cnt[1]<=average&&cnt[2]>=average){
int a=cnt[0]-average;
int c=cnt[2]-average;
for(int i=n-1;i>=0&&a;i--){
if(s[i]=='0'){
s[i]='1';
a--;
}
}
for(int i=0;i<n&&c;i++){
if(s[i]=='2'){
s[i]='1';
c--;
}
}
}
cout<<s<<endl;
return 0;
}