zoukankan      html  css  js  c++  java
  • CF1102D-Balanced Ternary String-(贪心)

    http://codeforces.com/problemset/problem/1102/D

    题意:

    有n个字符,只能为012,现要通过变换让012的数量相等,并且使字典序最小。

    解题:

    由样例可以看出不能打乱原来的位置,按001122这样输出,只能一个一个替换,贪心。

    1)只有0少了:优先把多余的2换成0,再把多余的1换成0。

    2)只有1少了:优先把多余的2换成1,等0够了再把多余的0换成1。

    3)只有2少了:等0和1够了,优先把多余的1换成2,再把多余的0换成2。

    4)0和1都少了:2优先换成0,再换成1,再输出自己的。

    5)0和2都少了:1优先换成0,1够了再换成2。

    6)1和2都少了:0够了再把多余的0换成1,再换成2。

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<math.h>
    #include<string>
    #include<map>
    #include<queue>
    #include<stack>
    #include<set>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    
    int n;
    string s;
    
    int main()
    {
        while(cin>>n)
        {
            cin>>s;
            int x=n/3;
            int zero=0,one=0,two=0;
            for(int i=0;i<n;i++)
            {
                if( s[i]=='0' )
                    zero++;
                else if(s[i]=='1')
                    one++;
                else
                    two++;
            }
            zero-=x;
            one-=x;
            two-=x;
            if( zero<0 && one>=0 && two>=0 )
            {
                for(int i=0;i<n;i++)
                {
                    if( s[i]=='2' && zero<0 && two>0 )
                        s[i]='0',zero++,two--;
                    else if( s[i]=='1' && zero<0 && one>0 )
                        s[i]='0',zero++,one--;
                }
            }
            else if( one<0 && zero>=0 && two>=0 )
            {
                int now0=0;
                for(int i=0;i<n;i++)
                {
                    if(s[i]=='0' && now0<x)
                        now0++;
                    else if( s[i]=='2' && one<0 && two>0 )
                        s[i]='1',one++,two--;
                    else if( s[i]=='0' && one<0 && zero>0 && now0==x )
                        s[i]='1',one++,zero--;
                }
            }
            else if( two<0 && zero>=0 && one>=0 )
            {
                int now0=0,now1=0;
                for(int i=0;i<n;i++)
                {
                    if(s[i]=='0' && now0<x)
                        now0++;
                    else if( s[i]=='1' && now1<x )
                        now1++;
                    else if( s[i]=='1' && one>0 && now1==x && two<0 )
                        s[i]='2',one--,two++;
                    else if( s[i]=='0' && zero>0 && now0==x && two<0 )
                        s[i]='2',zero--,two++;
    
                }
            }
            else if( zero<0 && one<0 && two>0 )
            {
                for(int i=0;i<n;i++)
                if( s[i]=='2' && two>0 && zero<0 )
                    s[i]='0',two--,zero++;
                else if( s[i]=='2' && two>0 && one<0 )
                    s[i]='1',two--,one++;
            }
            else if( zero<0 && two<0 && one>0 )
            {
                int now1=0;
                for(int i=0;i<n;i++)
                {
                    if( s[i]=='1' && zero==0 && now1<x )
                        now1++;
                    else if( s[i]=='1' && zero<0 && one>0 )
                        s[i]='0',zero++,one--;
                    else if( s[i]=='1' && now1==x && two<0 && one>0 )
                        s[i]='2',two++,one--;
    
                }
            }
            else if( one<0 && two<0 && zero>0 )
            {
                int now0=0;
                for(int i=0;i<n;i++)
                {
                    if( s[i]=='0' && now0<x )
                        now0++;
                    else if( s[i]=='0' && one<0 && now0==x && zero>0 )
                        s[i]='1',one++,zero--;
                    else if( s[i]=='0' && two<0 && now0==x && zero>0 )
                        s[i]='2',two++,zero--;
                }
            }
            cout<<s<<endl;
        }
        return 0;
    }
    CF1102D
  • 相关阅读:
    高性能JavaScript
    高性能CSS
    去掉超链接文字点击后的灰色框
    高性能HTML
    css整站规划
    css hack 和问题
    IE6支持min-width、max-width CSS样式属性
    WPF草稿
    正则表达式学习日记zz
    详解Adorner Layer(zz)
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11194296.html
Copyright © 2011-2022 走看看