A - スピーカーの音量 / Speaker Volume 解説 by admin
gpt-5.6-sol-high概要
測定点 \(P\) と異なる座標にある各スピーカーについて、届く音の強さ \(\frac{V_i}{|X_i-P|}\) を計算し、その総和を求めます。
考察
各スピーカーが測定点に与える音の強さは、ほかのスピーカーとは独立しています。そのため、スピーカー同士の組み合わせを調べる必要はなく、入力されたスピーカーを順番に処理して足し合わせれば十分です。
\(i\) 番目のスピーカーについて、\(X_i \neq P\) ならば距離は
\(|X_i-P|\)
なので、答えに
\(\frac{V_i}{|X_i-P|}\)
を加えます。
一方、\(X_i=P\) の場合は距離が \(0\) になり、ゼロ除算が発生してしまいます。問題文の指示どおり、このスピーカーは計算から除外します。
例えば、\(P=3\) のとき、次のスピーカーがあるとします。
- \((X,V)=(1,4)\):届く強さは \(\frac{4}{|1-3|}=2\)
- \((X,V)=(3,10)\):\(X=P\) なので除外
- \((X,V)=(7,8)\):届く強さは \(\frac{8}{|7-3|}=2\)
したがって、合計は \(2+2=4\) です。
この問題では単純な全探索、つまり全スピーカーを一度ずつ確認する方法がそのまま十分高速です。ただし、次のような実装では誤答になる可能性があります。
- \(X_i=P\) の場合も計算してゼロ除算してしまう
- 整数型のまま割り算し、小数部分を切り捨ててしまう
- 出力する小数の桁数が少なく、許容誤差を超えてしまう
アルゴリズム
- 答えを \(0\) で初期化する。
- 各スピーカーについて、座標 \(X_i\) と出力 \(V_i\) を読み込む。
- \(X_i=P\) なら、そのスピーカーを無視する。
- そうでなければ、距離 \(|X_i-P|\) を求める。
- \(\frac{V_i}{|X_i-P|}\) を浮動小数点数として答えに加える。
- 十分な小数桁数を指定して答えを出力する。
すべてのスピーカーで \(X_i=P\) だった場合は一度も加算されないため、そのまま \(0\) が出力されます。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)
実装のポイント
座標と距離の計算には
long longを使用し、安全に差を計算します。V / distanceを整数除算にしないため、Vをlong doubleに変換してから割ります。誤差を十分小さくするため、答えも
long doubleで保持します。fixed << setprecision(15)を指定し、小数点以下を十分な桁数で出力します。ソースコード
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
long long P;
cin >> N >> P;
long double answer = 0.0L;
for (int i = 0; i < N; ++i) {
long long X, V;
cin >> X >> V;
if (X != P) {
long long distance = (X > P ? X - P : P - X);
answer += static_cast<long double>(V) / distance;
}
}
cout << fixed << setprecision(15) << answer << '\n';
return 0;
}
この解説は gpt-5.6-sol-high によって生成されました。
投稿日時:
最終更新: