公式

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\) の場合も計算してゼロ除算してしまう
  • 整数型のまま割り算し、小数部分を切り捨ててしまう
  • 出力する小数の桁数が少なく、許容誤差を超えてしまう

アルゴリズム

  1. 答えを \(0\) で初期化する。
  2. 各スピーカーについて、座標 \(X_i\) と出力 \(V_i\) を読み込む。
  3. \(X_i=P\) なら、そのスピーカーを無視する。
  4. そうでなければ、距離 \(|X_i-P|\) を求める。
  5. \(\frac{V_i}{|X_i-P|}\) を浮動小数点数として答えに加える。
  6. 十分な小数桁数を指定して答えを出力する。

すべてのスピーカーで \(X_i=P\) だった場合は一度も加算されないため、そのまま \(0\) が出力されます。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • 座標と距離の計算には long long を使用し、安全に差を計算します。

  • V / distance を整数除算にしないため、Vlong 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 によって生成されました。

投稿日時:
最終更新: