部品の 重さの 平均と標準偏差
- 数と計算
- 問題 18
- ふつう
- 目安 31 分
工場で
本番の
入力は
問題
ある
平均 m は、
入力の形式
N
a_1 a_2 ... a_N1 行目に
出力の形式
2 行を
制約
- N は 1 以上 200000 以下の整数です
- 重さ a_i は 1 以上 100000 以下の整数です
入力と出力の例
例 1
4 個の
入力
4 10 20 30 40
出力
25.000000 11.180340
例 2
平均が
入力
3 5 5 6
出力
5.333333 0.471405
例 3
部品が
入力
1 7
出力
7.000000 0.000000
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
1 回目に
Python
Python
import sys
import math
data = sys.stdin.read().split()
n = int(data[0])
weights = list(map(int, data[1:1 + n]))
mean = sum(weights) / n
squares = 0.0
for w in weights:
squares += (w - mean) ** 2
stddev = math.sqrt(squares / n)
print(f"{mean:.6f}")
print(f"{stddev:.6f}")JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const n = data[0];
const weights = data.slice(1, 1 + n);
let sum = 0;
for (const w of weights) sum += w;
const mean = sum / n;
let squares = 0;
for (const w of weights) squares += (w - mean) ** 2;
const stddev = Math.sqrt(squares / n);
console.log(mean.toFixed(6));
console.log(stddev.toFixed(6));計算量
時間は O(N) です。sum(weights) / n と
よく ある間違い
- N ではなく N - 1 で
割ってしまう。 この 問題は 全部の 部品を 母集団と みる 標準偏差なので、 N で割ります - 出力の
桁を 決めずに 出して、 25.0や25と書いてしまう。 小数第 6 位まで 書く 決まりなので、 25.000000と出します - ループの
中で 平均を 求め直して、 O(N^2) に なる。 平均は ループの 前に 1 回だけ求めます - 「2 乗の
平均から 平均の 2 乗を 引く」式で 分散を 出すと、 値が 大きくて 散らばりが 小さい ときに、 引き算で 桁が 落ちて 誤差が 出る ことがあります。 平均を 先に 求めてから 差の 2 乗を 足すほうが安全です - 平均を
整数の 割り算 (Python の //) で求めて、 小数の 部分を 落としてしまう
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31