Python3で解く AtCoder Regular Contest 109 A - Hands
状態を把握するのに、ちょっと時間はかかったが、イメージはできた。しかし場合分けが多く、そこにハマったのでまとめる
目次
概要
- 100階建ての建物 がある。
- とは廊下でつながっていて、分かかる。
- とは廊下でつながっていて、分かかる。
- とおよびとは階段でつながっていて、分かかる。
- 与えられた、階から階へ最短時間で移動したときの時間は?
解くときに考えた内容
まずイメージ図
- 文意から、100階建ての建物 は上の一番左のようになっている。
- の大小で降りる手段として、廊下か階段かを選択すべきかがわかり、最後はへ移動するのにという構図。降りるときと登るときとでことなるのは降りるときしかへ移動できないので、そこで場合分けが必要。
- まずは、が同じフロアの場合、もしくはからが1階降りる場合。
- が最短。
(なぜなら、なので、は自明)
- が最短。
- 次に2階以上降りる場合。
- を とすると
- ということ。
- 1階おりるのにのとき、廊下を選んでで 階降りて、最後に で へ行く
- 1階おりるのにのとき、階段を選んでで 階降りて、最後に で へ行く
- 次に1階以上登る場合。
- これ上記のをと考えればいい。
コード
a, b, x, y = map(int, input().split()) step = b - a if step == 0 or step == -1: ans = x # 下に-1を含めても良い。結果xになるから elif step <= -2: if y >= 2 * x: ans = (abs(step)-1) * 2 * x + x else: ans = (abs(step)-1) * y + x elif step >= 1: if y >= 2 * x: ans = step * 2 * x + x else: ans = step * y + x print(ans)
終わりに
結構きれいに場合分けしないと、うまく行かない。絵に書けばだいたい分かるが、時間かかりすぎた。
参考になる書籍
- 問題解決力を鍛える!アルゴリズムとデータ構造
けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも非常に結構読みやすい!!!(実際に、けんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているし、この書籍も非常に読みやすい)どのようなステータスの人にもおすすめの一冊になっている。
とうとう発売され自分の手元にも来た(2020-10-03)。現在読み中なのである程度読み込んだら感想を書く予定。めっちゃ図が多いし、章末問題もあるしかなりイケてる。答えはC++で書かれているがそのうちPythonでも書かれるとのことなので、自分で前もってやってしまおうと思う(答え合わせできるのはありがたい)。
問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)
- 作者:大槻 兼資
- 発売日: 2020/10/02
- メディア: 単行本
7章までは別記事に残してある。 blacktanktop.hatenablog.com