ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC223 C - Doukasen【Python解答例】

AtCoder Beginner Contest223のC問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 223 - AtCoder



AtCoder Beginner Contest223 C - Doukasen

C - Doukasen

問題文

N 本の導火線を一直線に接着したものがあります。左から i 本目の導火線は長さが A i​ cm で、 1 秒あたり B i​ cm の一定の速さで燃えます。

この導火線の左端と右端から同時に火をつけるとき、 2 つの火がぶつかる場所が着火前の導火線の左端から何 cm の地点か求めてください。

制約

・1≤N≤10 ^5
・1≤A i​ ,B i​ ≤1000
・入力は全て整数

解答例

n = int(input())

A = []
B = []
for i in range(n):
    a, b = map(int,input().split())
    A.append(a)
    B.append(b)

time = 0
for i in range(n):
    tmp = A[i] / B[i]
    time += tmp
time /= 2

ans = 0
for i in range(n):
    if A[i] / B[i] <= time:
        ans += A[i]
        time -= A[i] / B[i]
    else:
        ans += B[i] * time
        break

print(ans)

解説

左端と右端から着火したとき、導火線のどの位置で2つの火がぶつかるか答える問題です。

ふたつの火がぶつかる時間は、片側から火をつけて燃え尽きるまでの時間の半分になりますのでこれをtimeとしました。

あとは左端からの距離をansとして、左からtimeになるまでの距離を足していき、timeとなったときのansを出力すればOKでした。





ABC223の関連記事はこちら
ebisuke33.hatenablog.com