#問題
問題はこちらから
#方針
左及び右からそれぞれ火がスタートして、各接着点に到達するまで何秒かかったかを累積和でleftとrightに取り、各項の差がマイナスからプラスに転じる地点 / ちょうど0になる地点をpointとし、pointから衝突地点までの距離をxとして距離を求めました。
#ソースコード
コメントアウトしてあるのはテストケースの一例です。
Python
1from itertools import accumulate 2 3N = int(input()) # 3 4A = [] # [1, 2, 3] 5B = [] # [3, 2, 1] 6for _ in range(N): 7 a, b = map(int, input().split()) 8 A.append(a) 9 B.append(b) 10 11left = [] 12right = [] 13for i in range(N): 14 left.append(A[i] / B[i]) 15 right.append(A[i] / B[i]) 16 17right = right[::-1] 18 19left = [0] + left 20right = [0] + right 21 22left = list(accumulate(left)) 23right = list(accumulate(right)) 24 25right = right[::-1] 26 27# left = [0, 0.3333333333333333, 1.3333333333333333, 4.333333333333333] 28# right = [4.333333333333333, 4.0, 3.0, 0] 29 30dif = [left[i] - right[i] for i in range(N + 1)] 31# dif = [-4.333333333333333, -3.6666666666666665, -1.6666666666666667, 4.333333333333333] 32 33if 0 in dif: 34 point = dif.index(0) 35 ans = 0 36 for i in range(point): 37 ans += A[i] / B[i] 38 print(ans) 39 40else: 41 point = float('inf') 42 for i in range(N): 43 if dif[i] < 0 and dif[i + 1] > 0: 44 point = i 45 a = sum(A[i] / B[i] for i in range(point)) # point地点までに左からかかった時間 46 b = sum(A[i] / B[i] for i in range(point + 1, N)) # (point + 1)地点までに右からかかった時間 47 x = ((b - a) * B[point] + A[point]) / 2 # point地点から衝突地点までの距離 # a + x / B[point] = b + (A[point] - x) / B[point] をxについて解いた 48 ans = x + sum(A[i] for i in range(point)) 49 print(ans)
#質問
方針は基本的に正しいようで、17個のテストケースのうち16個は正解でした。
1つのテストケースにおいて間違いがあったようです。
コーナーケースでの見落としがあるのか、または計算誤差が大きくなるような計算をしてしまっている箇所があるかという辺りを疑ったのですが、原因を特定することができませんでした。
素人質問にて恐縮ですが、お力添え頂ける箇所がございましたら、ご教授のほど何卒よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/17 15:06