AtCoder Beginner Contest (ABC) 189 PythonでA,B問題解いてみた
前回解いたやつ
後編(C問題)
こんにちは。メリーです。
今日はお家でゆっくりと雀魂をやってました。
雀魂って英語のタイトル名Mah-jong Soulなのカッコイイよね。
あともう少し(100pt無いくらい)で雀士から雀傑になれるのじゃ!!
※なったら雀魂の記事書きます。
というわけで本日も元気にAtCoder Beginner Contest (ABC) 189のA,B問題を解いて行きます。
今日は久しぶりにB問題で沼ったのでそこらへんの恨みつらみも合わせて・・・
C問題はこっち
言語はPython、提出はPyPyです。
目次ッ
A問題
問題文
ガチャの問題ですね。
しかも昔ながらのスロットタイプ。
モノクマのマシーンとか、よく回したな・・・
好感度を上げるとパンツくれるからな・・・
やってることギャルゲーだよね。
↓好感度を上げるとパンツがもらえるゲーム(スーパーの方だよ)。
↓な、何だってッ! Switch版が出ているだと・・・・ッ!
調べて初めて知った。しかも本編3作とも入ってんじゃん・・・
本編に戻ります。
方針はこんな感じで
1. if文で場合分けする。
以上!!
実装編
c = input() if c[0] == c[1] == c[2]: print("Won") else: print("Lost")
文字列としてinputします。
文字列なので、c[0]などとすることで、要素を取り出せます。
取り出した3つの要素が全て等しければWon、それ以外はLostを出力して終了。
B問題
問題文
アルコールをどれだけ飲めるか問題ですね。
アルコールの許容量を超えたらOUT!
その時の杯数を出力する問題ですね。
まぁ、Nがたかが103程度なので余裕で全探索で問題ないっすね〜〜〜〜
というわけで方針。
1. 全探索する。
2. 今までに飲んだアルコールの量を計算する。
3. 2が許容量を超えているかチェック
4. 超えてたら終了、超えてないなら続行
実装編
n,x = map(int,input().split()) v = [] p = [] for i in range(n): V,P = map(int,input().split()) v.append(V) p.append(P) alc = 0 ans = -1 for i in range(n): alc += v[i] * p[i] / 100 if alc > x: ans = i+1 break print(ans)
よし!余裕ですね!所詮B問題なんてこんなもんよ
提出!
:
:
:
:
:
:
:
:
:
:
:
なんでWAなんだよごらああああああああああああああああああああ
運営ごらああああああああああああああああああああああああああああ
というわけで解説を見ると、
浮動小数点数の演算は一般に誤差を含みます。
とのこと。
この誤差を解消するためにはそもそも小数(割り算)を使用しなければいいのね。そうなのね。
というわけで真の実装
n,x = map(int,input().split()) v = [] p = [] for i in range(n): V,P = map(int,input().split()) v.append(V) p.append(P) alc = 0 ans = -1 for i in range(n): alc += v[i] * p[i] if alc > 100*x: ans = i+1 break print(ans)
変更したのはこの部分
alc += v[i] * p[i] if alc > 100*x:
%計算を100倍することできれいに掛け算のみで計算することができました。
そんな感じっすね。 if文でのansの更新が入らなければansは-1が格納されているので変更されずに−1を出力しますよ。と。
C問題は明日やります。
やりました。
それでは。