首页 > 其他 > 详细

Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)

时间:2020-09-05 23:17:17      阅读:57      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小.

  • 题解:贪心,\(0\)一定放在前面,\(1\)\(2\)放后面,首先统计\(0,1,2\)的个数,因为题目要求字典序最小,所以我们先从左边开始遍历,如果\(2\)的个数大于\(n/3\),那么再看\(0\)\(1\)的个数情况将其替换成\(0\)\(1\),对\(1\)也是如此,然后我们再反着遍历,首先考虑\(1\)的情况,再考虑\(0\)的情况.具体的细节看代码吧.

  • 代码:

    int n;
    char s[N];
    map<int,int> mp;
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        n=read();
        scanf("%s",s+1);
        int cnt=n/3;
        for(int i=1;i<=n;++i){
            if(s[i]==‘0‘) mp[0]++;
            else if(s[i]==‘1‘) mp[1]++;
            else mp[2]++;
        }
     
        for(int i=1;i<=n;++i){
            if(s[i]==‘2‘){
                if(mp[2]>cnt){
                    if(mp[0]<cnt) s[i]=‘0‘,mp[0]++,mp[2]--;
                    else if(mp[1]<cnt) s[i]=‘1‘,mp[1]++,mp[2]--;
                }
            }
            else if(s[i]==‘1‘){
                if(mp[1]>cnt){
                    if(mp[0]<cnt) s[i]=‘0‘,mp[0]++,mp[1]--;
                }
            }
        }
     
        for(int i=n;i>=1;--i){
            if(s[i]==‘1‘ && mp[1]>cnt){
                if(mp[2]<cnt) s[i]=‘2‘,mp[2]++,mp[1]--;
            }
            else if(s[i]==‘0‘ && mp[0]>cnt){
                if(mp[2]<cnt) s[i]=‘2‘,mp[2]++,mp[0]--;
                else if(mp[1]<cnt) s[i]=‘1‘,mp[1]++,mp[0]--;
            }
        }
     
        for(int i=1;i<=n;++i){
            printf("%c",s[i]);
        }
     
        return 0;
    }
    

Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)

原文:https://www.cnblogs.com/lr599909928/p/13619044.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!