考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC070-B - Two Switches を解く

ABC070-B - Two Switches

 

1発で通すのは中々難しい問題

場合分けの際に漏れがでやすい

 

シミュレーションするならば

2つの線分を横に並べた状態をイメージするとわかりやすいだろう

全パターンを以下に示す

 

その1

  AーーーーーーB

            CーーーーーーD

 

その2

  AーーーーーーB

      CーーーーーーD

 

その3

  AーーーーーーB

 CーーーーーーーーD

 

その4

      AーーーーーーB

  CーーーーーーD

 

その5

            AーーーーーーB

  CーーーーーーD

 

その6

      AーーーーーーB

  CーーーーーーD

 

その7

 AーーーーーーーーB

  CーーーーーーD

 

その8

  AーーーーーーB

      CーーーーーーD

 

その9

  AーーーーーーB

            CーーーーーーD

 

前半は A-B を動かして、後半は C-D を動かすイメージでパターンを列挙した

 

パターンが被っているものもいくつかあるが、そのまま書いて問題ない

下手に無駄な部分を消そうとするとパターン漏れが出来る可能性があるからだ

 

以上を踏まえて書いたコードを以下に示す

 

提出したコード

# 入力
A,B,C,D=map(int,input().split())

if B<=C:
  print(0)
elif A<=C and C<=B and B<=D:
  print(B-C)
elif C<=A and B<=D:
  print(B-A)
elif C<=A and A<=D and D<=B:
  print(D-A)
elif D<=A:
  print(0)
elif C<=A and A<=D and D<=B:
  print(D-A)
elif A<=C and D<=B:
  print(D-C)
elif A<=C and C<=B and C<=D:
  print(C-A)
elif B<=C:
  print(0)

 

提出結果はACでした

 

解説ではシンプルでわかりやすいコードを書いていました

それに比べると自分の書いたコードは泥臭いしバグりやすいですね…

 

興味のある方は以下リンクよりご確認ください