Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)
时间:2020-09-05 23:17:17
收藏:0
阅读:59
-
题意:给你一个长度为\(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; }
原文:https://www.cnblogs.com/lr599909928/p/13619044.html
评论(0)