[ARC127] B - Ternary Strings

[Q] https://atcoder.jp/contests/arc127/tasks/arc127_b
解けなかった。

Q. 辞書順で最大の値を最小にするとは?
200からはじまるものを、N個固定してしまえばいい。
N=3, L=3 なら 200 201 202
N=2, L=2 なら 20 21

Q. そのあと、0xxと1yyの下りをどう振り分けるの?
200が決まったら、200 -> 011 -> 122と、数値を0->1->2で回していけばよかった。

int main(){
 cincout();
 
 ll N, L;
 cin >> N >> L;
 
 ll base = powl(3,L-1)*2; //2000 = 3^3 *2
 rep(i, N){
   ll b=base+i;
   string S;
   rep(l, L){
     S += b%3+'0';
     b/=3;
   }
   reverse(all(S));
   cout << S << endl; // 200 201 202
   rep(k, 2){
     rep(j, L){
       ++S[j];
       if (S[j]=='3') S[j]='0';
     }
     cout << S << endl; // 011+122 012+120 
   }
 }
}

Bは気づきの問題で、気づけなかった。
変なルールにもっともっと着目できれば、あるいは。

https://atcoder.jp/contests/arc127/submissions/26109542

この記事が気に入ったらサポートをしてみませんか?