考えて競プロする

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

ABC001-B - 視程の通報 を解く

ABC001-B - 視程の通報


いきなり面倒臭そうだ…

 

…でもよく読んでみるとそこまで複雑ではない

5パターンの分岐を書けばいいだけじゃん

 

説明中に書かれている単位は[km]だけど

入力は[m]

直す必要がある

 

各分岐中の処理は簡単な算数だけど、1桁の場合は十の位を0埋めしないといけないらしい

0埋めってどうやるんだっけ

 

(ググった)

なるほど、右寄せ0埋めは zfill関数 というものがあるらしい

計算結果をstr型にキャストしてこいつをかませればいけそうだ

 

 …これ、答えは3桁になることもあるのかな? よくわからんな

あ、問題文中に必ず2桁になると書いてあった。じゃあ大丈夫か 

 

5つの条件の内、計算結果が1桁になり得るのは 2番目の「0.1km以上5km以下」だけか…(他は固定値か、最後に10以上の数を加算しているので)

じゃあこのときだけ0埋めの処理をすればいいか

 

書いてみたけど、これ条件分岐隙間だらけじゃん…mが5.5kmとかだったらどうすんだ?

(問題文を読む)

…どうやらそういう値は入力されないらしい

 

よし、サンプルを投げてみるか

…出力結果が小数で出てきた。 最初の単位変換で数値が小数になっているのか

計算結果は int型にキャストする必要があるな

 

提出したコード

# 入力
m=int(input())

# m->kmに直す
m/=1000

# 出力値(初期値はどうせ上書きされるので適当)
VV=0

if m<0.1:
  VV='00'
elif 0.1<=m and m<=5:
  VV=m*10
  # int型にキャスト
  VV=int(VV)
  # 文字列型に変換(zfillの準備)
  VV=str(VV)
  # 十の位まで0埋めする
  VV=VV.zfill(2)
elif 6<=m and m<=30:
  VV=m+50
  # int型にキャスト
  VV=int(VV)
elif 35<=m and m<=70:
  VV=(m-30)//5+80
  # int型にキャスト
  VV=int(VV)
else:
  VV=89

# 計算結果を出力
print(VV)

 

ACだった

結構面倒臭かったね