皆さん、こんにちは!
今回はABC-013のB問題「錠」について解説していきたいと思います!
(https://atcoder.jp/contests/abc013/tasks/abc013_2)
目次
- 問題概要
- 制約
- 入力形式
- 解説
問題概要
ダイヤルロック式の錠がある。
この錠の赤いボタンを押すと、ディスプレイに表示されている数が$1$増え、青いボタンを押すと$1$減る。
ただし、ディスプレイの表示が$9$のときに赤いボタンを押すと$0$になり、ディスプレイの表示が$0$のときに青いボタンを押すと$9$になる。
現在ディスプレイに表示されている数字は$a$で、この数字が$b$になると錠が空く。
錠を開けるために最低でボタンを何回押せばいいか求めよ。
ABC013-B
制約
$0 \leq a,b \leq 9$ ($N$は整数)
入力形式
a b
解説
少し複雑な条件に思えてしまいますが、一旦シンプルな例で考えてみましょう。
例1
- $a = 4, b = 6$の場合
入力例1のパターンですね!
赤いボタンを$2$回押せばよいだけなので、答えは$2$となります。
例2
- $a = 6, b = 4$の場合
これは入力例2です。
a,bの差が$2$なので、青いボタンを$2$回押せば$a=b$となり錠が開きます。
例3
- $a = 8, b = 1$の場合
この場合はどうでしょう?
先ほどの$2$つの例と同じように考えると、ボタンを$7$回押して$a=b$とすればいいように思えます。
しかし問題文をよく読むと、「ディスプレイの表示が$9$のときに赤いボタンを押すと$0$になり、ディスプレイの表示が$0$のときに青いボタンを押すと$9$になる。」とあります。
この条件を考慮に入れると、赤いボタンを$3$回押すと$a=b$となることがわかります - $8→9→0→1$ $(3回)$
結論
上述のとおり、出力すべき数字は
- $aとb$の差
- $min(a,b)$に$10$を足したものから$max(a,b)$を引いたもの
のうち小さいほうであることがわかります。
それを実装すると下記のようになります。
013-B.cpp
#include <iostream>
using namespace std;
int main(void){
int a;
int b;
cin>>a;
cin>>b;
int ans;
ans = min(abs(a-b), abs(min(a,b)+10-max(a,b)));
cout<<ans<<endl;
}