競技プログラミング用 知識集積所
ABC407C - Security 2
最終更新:
sport_programming
-
view
問題
必要知識
B以下レベルの内容は省略
- 特になし
考え方
ボタンAとボタンBで別々に考える。
Aは押した回数が桁数になるので、Sの文字数を調べればすぐにわかる。
難しいのはBの方で、以下のように考える。
Aは押した回数が桁数になるので、Sの文字数を調べればすぐにわかる。
難しいのはBの方で、以下のように考える。
例えば"53"の場合。
2つ目の数字が3であるということは、2回目にボタンAを押した後にボタンBを3回押すことになる。
ということは、2回目にボタンAを押す瞬間には、1つめの数字は2になっていなければならない。
これは5-3=2という計算で出せる。
2つ目の数字が3であるということは、2回目にボタンAを押した後にボタンBを3回押すことになる。
ということは、2回目にボタンAを押す瞬間には、1つめの数字は2になっていなければならない。
これは5-3=2という計算で出せる。
例えば"35"の場合。
2つ目の数字が5であるということは、2回目にボタンAを押した後にボタンBを5回押すことになる。
ということは、2回目にボタンAを押す瞬間には、1つめの数字は8になっていなければならない。
これは3-5=-2が負になるので、さらに+10して8という計算で出せる。
2つ目の数字が5であるということは、2回目にボタンAを押した後にボタンBを5回押すことになる。
ということは、2回目にボタンAを押す瞬間には、1つめの数字は8になっていなければならない。
これは3-5=-2が負になるので、さらに+10して8という計算で出せる。
つまり、次の数字から前の数字を引いてから負の数なら+10する、という計算で各ボタンAの間に何回ボタンBを押すかを求められる。
if分岐で出してもいいし、10足してから%10してもよい。
また、int(未作成)型に直して引かなくても、char型のまま引き算してしまって問題ない。
if分岐で出してもいいし、10足してから%10してもよい。
また、int(未作成)型に直して引かなくても、char型のまま引き算してしまって問題ない。
それらの合計を、ボタンAを押す回数に足せばおしまい。
解答例
注意点
最後の1回分に注意。
別解
倍数化アルゴリズムを使用する。
例えば"2025"の場合。
最後にボタンAを押した後にボタンBを5回押す必要がある。
3回目にボタンAを押した後にボタンBを合計で「10で割って2余る」かつ「5回以上」である回数、つまり12回押す必要がある。
2回目にボタンAを押した後にボタンBを合計で「10で割って0余る」かつ「12回以上」である回数、つまり20回押す必要がある。
1回目にボタンAを押した後にボタンBを合計で「10で割って2余る」かつ「20回以上」である回数、つまり22回押す必要がある。
ボタンAの4回と合わせて答えは26回、という手順で出すこともできる。
解答例
最後にボタンAを押した後にボタンBを5回押す必要がある。
3回目にボタンAを押した後にボタンBを合計で「10で割って2余る」かつ「5回以上」である回数、つまり12回押す必要がある。
2回目にボタンAを押した後にボタンBを合計で「10で割って0余る」かつ「12回以上」である回数、つまり20回押す必要がある。
1回目にボタンAを押した後にボタンBを合計で「10で割って2余る」かつ「20回以上」である回数、つまり22回押す必要がある。
ボタンAの4回と合わせて答えは26回、という手順で出すこともできる。
解答例