D - Balanced Ternary String (贪心)
题目链接: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\n",str); 80 } 81