codeforces 1102D Balanced Ternary String(贪心+思维)
https://codeforces.com/contest/1102/problem/D
主要是满足字典序最小的时候。
#include <cstdio> #include <algorithm> #include <iostream> #include <map> #include <cstring> using namespace std; typedef long long ll; int main(){ char s[300005]; int n,sum[3]; while(~scanf("%d",&n)){ scanf("%s",s); sum[0] = 0,sum[1] = 0,sum[2] = 0; for(int i=0;i<n;i++){ if(s[i] == '0') sum[0]++; else if(s[i] == '1') sum[1]++; else sum[2]++; } int k=0; if(sum[2] <= n/3) { if(sum[1]<n/3){//当1不足,2不足的时候,倒着先放2 for(int i=n-1;i>=0;i--){ if(sum[s[i]-'0']>n/3){ for(int j=2;j>=1;j--){ if(sum[j]<n/3){ sum[j]++; sum[s[i]-'0']--; s[i] = j+'0'; break; } } } } } else{//当2不足,1足的时候,先倒着放2,2放完了,再顺着放0 for(int i=n-1;i>=0;i--){ if(sum[s[i]-'0']>n/3){ for(int j=2;j>=2;j--){ if(sum[j]<n/3){ sum[j]++; sum[s[i]-'0']--; s[i] = j+'0'; break; } } if(sum[2] == n/3) { k=i; break; } } } } for(int i=0;i<k;i++){ if(sum[s[i]-'0']>n/3){ for(int j=0;j<=1;j++){ if(sum[j]<n/3){ sum[j]++; sum[s[i]-'0']--; s[i] = j+'0'; break; } } } } } else {//当2足,0也足的时候 if(sum[0]>n/3){ for(int i=0;i<n;i++){//先顺着把2改了再倒着把0改了 if(s[i] == '2'){ s[i]='1'; sum[1]++; sum[2]--; } if(sum[2] == n/3) break; } for(int i=n-1;i>=0;i--){ if(s[i] == '0') { s[i]='1'; sum[1]++; sum[0]--; } if(sum[1] == n/3) break; } } else//当2足,0不足的时候,顺着放01就好了 { for(int i=0;i<n;i++){ if(sum[s[i]-'0']>n/3){ for(int j=0;j<=1;j++){ if(sum[j]<n/3){ sum[j]++; sum[s[i]-'0']--; s[i] = j+'0'; break; } } } } } } printf("%s\n",s); } return 0; }