AtCoderで茶色を目指す 18日目

6:00起床。最近、寒い。涼しいじゃなくて寒い。

暖房出そうかな。。。

目標

 次回、コンテストまでにB問題を解き切るのが目標。そのために、15〜20問解こうと思います。B問題は難しいと感じることが多いです。でも、全てが解けない、できないじゃない!成長する見込みしか感じないよ。

備忘録

計算結果が変

  備忘録の題名が雑ですが。。。解きたい問題は以下です。

atcoder.jp

 そして、自分が作ったコードです。ちなみに、結果はWA(間違った解答)。

n, x = map(int, input().split())
alchole = [list(map(int, input().split())) for i in range(n)]
v = [a[0] for a in alchole]
p = [a[1] for a in alchole]
m =[]
for i in range(n):
m.append(v[i]*p[i]/100)
if sum(m)>x:
print(i+1)
break
if sum(m)<=x:
print(-1)

 1杯あたりのアルコール量をリスト化して、境界を超えたら繰り返し処理を終了して、結果を出力しようっていう考えで書きました。
 提出結果では、ケースが31個の中7個が誤答でした。sampleは全て正解だったので、テストケースを調べて、誤答したケースでコードテストすると。。。

7.000000000000009 ⇦(7*100/100)の結果

 上のコードにおけるsum(m)の結果です。「9」ってどこから湧いた!?という訳で、ようやく本題です。「python 割り算 誤差」でググりました。

qiita.com

 こちらのサイトに誤差が発生する原因と解決方法がありました。ありがたいです。原因は分かりましたが、今回のケースにおいては解決法が適用できないです。。。
 でも、これで割り算を使うと上手くいかないことがわかったので、割り算を使わない方法を考えました。

for i in range(n):
m.append(v[i]*p[i])
if sum(m)>(x*100):
print(i+1)
break
if sum(m)<=x*100:
print(-1)

 繰り返し処理の部分を抜粋しました。前半の入力は先にあるコードと変えてないです。式変換をしました。条件式に出てた割り算(/100)は両辺にかけてやりました。

これで、無事に正解!

 

反省

B問題の進捗具合がイマイチです。問題を解いていくたびに、新発見があったりで脳がキャパオーバーしそう。でも、問題解いた分解法を知って、それを他の問題に活かすこともできてる。もう少しだけ頑張ろう。

参考サイト

B - Alcoholic

プログラミングにおける数値計算はワナがいっぱい - Qiita