8.6 Очередь и кольцевой буфер

8.6.2 Последние измерения

Условие

Реализуйте класс RecentMeasurements, который хранит не более capacity последних целочисленных измерений в кольцевом буфере. Конструктор задаёт вместимость; исходно буфер пуст. Метод void add(int value) добавляет измерение, а при заполненном буфере заменяет самое старое. Новое значение становится самым свежим.

Предусмотрите методы int size() const, int get(int index) const и double average() const. Метод get использует логические индексы с нуля: 0 соответствует самому старому сохранённому измерению. Он вызывается только с допустимым индексом. Среднее вычисляйте по всем сохранённым измерениям; на пустом буфере average() возвращает 0.0.

Используйте закрытый массив вместимости 1000 и кольцевую индексацию; готовые контейнеры и сдвиг всех элементов при добавлении запрещены. После каждого нового измерения выведите количество сохранённых значений и среднее. В конце выведите содержимое буфера от старого к новому.

Ограничения

Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Язык: C++17.

Входные данные

В первой строке вводятся capacity и N. Во второй — N целых измерений. Ограничения: 1 ≤ capacity ≤ 1000, 1 ≤ N ≤ 10000, −10⁶ ≤ value ≤ 10⁶.

Выходные данные

После каждого добавления выведите отдельную строку: текущий размер и среднее с шестью знаками после десятичной точки через пробел. В последней строке выведите все сохранённые измерения через пробел в порядке от старого к новому.

Примеры

Вход 1
3 5
10 20 30 40 50
Ожидаемый выход
1 10.000000
2 15.000000
3 20.000000
3 30.000000
3 40.000000
30 40 50
Вход 2
1 3
-5 0 7
Ожидаемый выход
1 -5.000000
1 0.000000
1 7.000000
7
Вход 3
4 2
1 2
Ожидаемый выход
1 1.000000
2 1.500000
1 2

Пробный запуск

Код берётся из редактора. Запуск не создаёт посылку и не влияет на баллы.

Выберите пример или введите свои данные и нажмите «Запустить».

Текущая попытка

Отправьте решение. Этапы и результат появятся здесь автоматически.

Все попытки

Войдите, чтобы видеть свои попытки.

Редактор

Один файл до 64 КиБ · Tab / Shift+Tab — отступ · Esc — выход из редактора · черновик сохраняется для этого аккаунта, задачи и языка.