CF-1102-D

思路

不外乎八种情况,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;
}
Author: universal42
Link: https://universal4s.github.io/2019/02/18/cf-1102-d/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.