Редакция для Среднее арифметическое


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно найти обычное среднее арифметическое температур.

Если температуры равны t_1, t_2, ..., t_n, то ответ — это сумма всех температур, делённая на число дней n.

Значит, задача сводится к двум действиям:

  • посчитать сумму всех чисел;
  • разделить её на n.

2. Наблюдения

  • Все температуры — целые числа, но среднее арифметическое может быть дробным, поэтому ответ нужно выводить как вещественное число.
  • По условию допускается погрешность 1e-6, значит достаточно вывести, например, 6 знаков после запятой.
  • Значения температур могут быть большими: до 10^9 по модулю.
  • Количество дней может быть до 2 * 10^5, поэтому сумма по модулю может достигать примерно 2 * 10^14.
  • Такой результат не поместится в тип int, поэтому в C++ нужно использовать long long.

3. Алгоритм

  1. Считать число n.
  2. Создать переменную sum и изначально сделать её равной 0.
  3. Считать все n температур и прибавить их к sum.
  4. Вычислить average = sum / n.
  5. Вывести average с точностью 6 знаков после запятой.

4. Почему это работает

По определению среднее арифметическое набора чисел равно:

  • сумме всех чисел,
  • делённой на их количество.

Алгоритм как раз и делает это напрямую:

  • накапливает сумму всех температур;
  • делит полученную сумму на число дней n.

Следовательно, результат алгоритма в точности равен средней температуре за весь период наблюдений.

5. Сложность

Пусть дано n температур.

  • Время работы: O(n), потому что каждое число обрабатывается один раз.
  • Дополнительная память: O(1) в C++, так как храним только сумму и текущий элемент.

В Python в эталонном решении используется список, поэтому дополнительная память равна O(n).

6. Код на C++17

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int n;
    cin >> n;

    long long sum = 0;
    for (int i = 0; i < n; i++) {
        long long x;
        cin >> x;
        sum += x;
    }

    double average = (double)sum / n;
    cout << fixed << setprecision(6) << average << '\n';

    return 0;
}

7. Код на Python 3

n = int(input())
a = list(map(int, input().split()))
s = sum(a)
print(f"{s / n:.6f}")

Комментарии

Еще нет ни одного комментария.