Balanced Ternary String

给出一个长为n的只由'1','2','0'组成的字符串,要求改动最少的位置,使'1','2','0'的个数相同(保证n能被3整除),并使改动后的字符串字典序最小。

n不大于3∗105

贪心思路,从左向右大的变小的,从右向左小的变大的:

复制代码
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; string s,ss; int res,n,x,num1,num0,num2; int main() { cin>>n>>s; ss=s; x=n/3; for(int i=0;i<n;i++){ if(s[i]=='0') num0++; else if(s[i]=='1') num1++; else if(s[i]=='2') num2++; } if(num2>x){ if(num0<x&&num2>x) for(int i=0;i<n;i++){ if(num2>x&&num0<x&&s[i]=='2') s[i]='0',num2--,num0++; if(num0==x||num2==x) break; } if(num1<x&&num2>x) for(int i=0;i<n;i++){ if(num2>x&&num1<x&&s[i]=='2') s[i]='1',num2--,num1++; if(num1==x||num2==x) break; } } if(num1>x){ if(num0<x&&num1>x) for(int i=0;i<n;i++){ if(num1>x&&num0<x&&s[i]=='1') s[i]='0',num1--,num0++; if(num0==x||num1==x) break; } if(num2<x&&num1>x) for(int i=n-1;i>=0;i--){ if(num1>x&&num2<x&&s[i]=='1') s[i]='2',num1--,num2++; if(num2==x||num1==x) break; } } if(num0>x){ for(int i=n-1;i>=0;i--){ if(num0>x&&s[i]=='0'){ if(num2<x) s[i]='2',num2++,num0--; else if(num1<x) s[i]='1',num1++,num0--; } } } cout<<s; return 0; }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17477115.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示