質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

653閲覧

AtCoder エラーが1つ取れない

kay_ventris4

総合スコア269

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/17 14:17

#問題
イメージ説明
問題はこちらから

#方針
左及び右からそれぞれ火がスタートして、各接着点に到達するまで何秒かかったかを累積和で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つのテストケースにおいて間違いがあったようです。
コーナーケースでの見落としがあるのか、または計算誤差が大きくなるような計算をしてしまっている箇所があるかという辺りを疑ったのですが、原因を特定することができませんでした。
素人質問にて恐縮ですが、お力添え頂ける箇所がございましたら、ご教授のほど何卒よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python

1 for i in range(point): 2 ans += A[i] / B[i] 3 print(ans)

これだとansには時間が入りますね

投稿2021/10/17 14:58

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kay_ventris4

2021/10/17 15:06

単位の確認を怠っておりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問