给出一个长为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; }
标签:&&,ix,num0,String,num2,int,Ternary,Balanced,num0x From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17477115.html