AtCoder Beginner Contest

【pythonでABC189を解説】B - Alcoholic

問題概要

問題ページ

問題文

高橋君はお酒を \(N\) 杯飲みました。

\(i\) 番目に飲んだお酒は、量が \(V_i\) ml、アルコール度数が \(P_i\) % です。

高橋君はアルコールの摂取量が \(X\) ml を超えると酔っ払います。

高橋君が酔っ払ったのは何杯目のお酒を飲んでいるときですか。ただし、\(N\) 杯全てのお酒を飲んだあとでも酔っ払っていない場合は、かわりに -1 を出力してください。

制約

  • 入力は全て整数
  • \(1 \leq N \leq 10^3\)
  • \(0 \leq X \leq 10^6\)
  • \(1 \leq V_i \leq 10^3\)
  • \(0 \leq P_i \leq 100\)

問題の考察

高橋君が一定のアルコールを摂取しているかどうか判別する問題。

お酒の量とアルコール度数が標準入力で与えられ、お酒に含まれるアルコール量を次の式で求める。

\(\displaystyle \frac{お酒の量 \times アルコール度数}{100}\)

しかし、この式でコーディングすると割り切れない場合に小数点以下の誤差が生じる可能性があるので、端数を発生させない計算方法を考える必要がある。

\(\displaystyle \frac{お酒の量 \times アルコール度数}{100}\)\(\gt X\)

\(お酒の量 \times アルコール度数\)\(\gt X \times 100\)

このように、両辺を\(100\)倍して整数値で比較できるようにすれば良い。

たびすけ
問題文で少数以下の誤差について言及がない問題は注意しましょう!

この問題も誤差が発生するとWAになります!

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    n, x = list(map(int, input().rstrip('\n').split()))
    x *= 100
    t = 0
    for i in range(n):
        v, p = list(map(int, input().rstrip('\n').split()))
        t += v * p
        if x < t:
            print(i + 1)
            exit()
    print(-1)


if __name__ == '__main__':
    solve()

-AtCoder Beginner Contest
-