🤍

ABC-013B「錠」 解説

2023/10/26に公開

皆さん、こんにちは!
今回はABC-013のB問題「錠」について解説していきたいと思います!
https://atcoder.jp/contests/abc013/tasks/abc013_2

目次

  • 問題概要
  • 制約
  • 入力形式
  • 解説

問題概要

ダイヤルロック式の錠がある。
この錠の赤いボタンを押すと、ディスプレイに表示されている数が1増え、青いボタンを押すと1減る。
ただし、ディスプレイの表示が9のときに赤いボタンを押すと0になり、ディスプレイの表示が0のときに青いボタンを押すと9になる。
現在ディスプレイに表示されている数字はaで、この数字が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;
}

https://atcoder.jp/contests/abc013/submissions/39744274
実際に提出したコードはこちらです。

Discussion