Long Beautiful Integer - #609 div2 c
#greedy
解法
i番目とi + k番目は同じ数
同じグループにする
グループ内では数字を合わせる
手前の数が入ってるグループほど値を大きくしたくない
例
6 2
123456
グループに分けると,
グループ1
1, 3, 5
グループ2
2, 4, 6
ここで, 先頭に近いほど値を変えたくない
より大きくなるから
グループごとに, 先頭に合わせる
すると,
121212
になる
値を変えるなら, 先頭から遠いグループから
グループ2の値を1大きくする
すると,
131313 > 123456
になる
まず, グループを作るときに各グループ内で先頭の数に合わせた
(2)のように, グループ全体の値を変えるとき, (1)で変えなかった先頭の数が大きくなる
その大きくなった先頭の数を i 番目とする
i + 1 番目以降の変化はどうでもいい
i 番目が大きくなったから
そして, i - 1 番目より前は値が変わっていない
よって, k 個のグループを後ろから見て, 変えられるのを探す
9 なら変えられない
9 ならそれより前のグループの値を変えることになる
9 だったグループの数を 0 にするのをお忘れなく
コード
https://codeforces.com/contest/1269/submission/67599429
ちょっと説明
(1)の操作で元の数 a より値が大きくなった場合, (2)はいらない
それを flg で判定
初めてでなくなったとき, だったなら
は小さくなり, (2)が必要
ケース
ケース1
6 3
123456
6
124124
ケース2
6 4
123456
6
123512
ケース3
6 1
318772
6
333333
ケース4
7 3
7283464
7
7287287
ケース5
4 3
2137
4
2142
ケース6
7 3
1117653
7
1121121
ケース7
3 2
192
3
202
ケース8
3 2
112
3
121