• D


    题目链接:http://codeforces.com/contest/1102/problem/D

    题目大意:给你一个字符串,这个字符串是由0,1,2构成的,然后让你替换字符,使得在替换的次数最少的前提下,使得新获得的字符串中0,1,2这三个字 符的数目相同,并且新获得的字符串字典序要尽可能的小。

    具体思路: 我们先统计出每个字符的个数,想一下,除了三个都相等的情况下,这三个中的某一个肯定是大于n/3的,我们就枚举每一个字符。

    如果是2多的话,我们就用1和0从前面进行替换。

    如果是1多的话,我们就用2和0进行替换,为了保证字典序最小,我们将0从前面进行替换,2从后面进行替换,

    如果是0多的话,我们就从后面开始替换,先从2开始,然后再从1开始。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 3e5+100;
     4 int num[4];
     5 char str[maxn];
     6 int main()
     7 {
     8     int len;
     9     scanf("%d",&len);
    10     scanf("%s",str);
    11     for(int i=0; i<len; i++)
    12     {
    13         num[str[i]-'0']++;
    14     }
    15     int tmp=len/3;
    16     if(num[0]>tmp)
    17     {
    18         for(int i=len-1; i>=0; i--)
    19         {
    20             if(str[i]=='0')
    21             {
    22                 if(num[2]<tmp&&num[0]>tmp)
    23                 {
    24                     num[2]++,num[0]--,str[i]='2';
    25                 }
    26                 else if(num[1]<tmp&&num[0]>tmp)
    27                 {
    28                     num[1]++,num[0]--,str[i]='1';
    29                 }
    30             }
    31         }
    32     }
    33     if(num[1]>tmp)
    34     {
    35         for(int i=0; i<len; i++)
    36         {
    37             if(str[i]=='1')
    38             {
    39                 if(num[0]<tmp&&num[1]>tmp)
    40                 {
    41                     num[0]++,num[1]--,str[i]='0';
    42                 }
    43             }
    44         }
    45         for(int i=len-1; i>=0; i--)
    46         {
    47             if(str[i]=='1')
    48             {
    49                 if(num[2]<tmp&&num[1]>tmp)
    50                 {
    51                     num[2]++;
    52                     num[1]--;
    53                     str[i]='2';
    54                 }
    55             }
    56         }
    57     }
    58     if(num[2]>tmp)
    59     {
    60         for(int i=0; i<len; i++)
    61         {
    62             if(str[i]=='2')
    63             {
    64                 if(num[0]<tmp&&num[2]>tmp)
    65                 {
    66                     num[0]++;
    67                     num[2]--;
    68                     str[i]='0';
    69                 }
    70                 else if(num[1]<tmp&&num[2]>tmp)
    71                 {
    72                     num[1]++;
    73                     num[2]--;
    74                     str[i]='1';
    75                 }
    76             }
    77         }
    78     }
    79     printf("%s
    ",str);
    80 }
    81  
  • 相关阅读:
    avalov+require实现tab栏
    动态加载js,css
    Zepto.js
    Linux 的文件和目录管理类命令
    shell 的基本理解
    Linux 日期时间命令
    Linux 关机命令
    type 命令
    命令类型即使用帮助
    cd 命令
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262737.html
Copyright © 2020-2023  润新知