Редакция для Текущий максимум
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно для каждой позиции массива знать максимум на префиксе, то есть среди всех элементов от начала до этой позиции.
Самый прямой способ: идти слева направо и хранить текущий максимум cur.
- Первый элемент сразу становится текущим максимумом.
- Для каждого следующего элемента:
- если он больше
cur, обновляемcur; - записываем
curв ответ.
- если он больше
Так после каждого шага у нас будет именно то значение, которое должно показываться на табло.
2. Наблюдения
Ответ для позиции
iзависит только от элементовa[0], a[1], ..., a[i].Если мы уже знаем максимум на первых
i - 1элементах, то для позицииiне нужно пересчитывать всё заново:- новый максимум равен либо старому максимуму,
- либо текущему элементу, если он больше.
Поэтому задачу можно решить за один проход по массиву.
Пример для массива 3 1 4 1 5:
- после
3: максимум3 - после
1: максимум остаётся3 - после
4: максимум становится4 - после
1: максимум остаётся4 - после
5: максимум становится5
Ответ: 3 3 4 4 5.
3. Алгоритм
- Считать
n. - Считать последовательность.
- Создать массив ответа
ans. - Взять первый элемент как текущий максимум
cur. - Добавить
curвans. - Для каждой следующей позиции:
- если текущий элемент больше
cur, присвоитьcur = элемент; - добавить
curвans.
- если текущий элемент больше
- Вывести массив
ans.
4. Почему это работает
Докажем, что алгоритм действительно выводит максимум на каждом префиксе.
Будем рассматривать элементы слева направо.
- Для первой позиции всё верно: максимум среди одного элемента равен самому этому элементу.
- Пусть после обработки позиции
i - 1переменнаяcurхранит максимум среди элементов от0доi - 1. - Тогда для позиции
iмаксимум среди элементов от0доiможет быть только:- прежним максимумом
cur, еслиa[i]не больше него; - новым элементом
a[i], если он большеcur.
- прежним максимумом
Именно это и делает алгоритм:
- сравнивает
a[i]иcur, - при необходимости обновляет
cur, - записывает получившееся значение в ответ.
Значит, после каждого шага в ans оказывается точный максимум на соответствующем префиксе. Следовательно, весь ответ строится правильно.
5. Сложность
Массив просматривается один раз.
- Время:
O(n) - Память:
O(n)на массив ответа
6. Код на C++17
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> ans;
ans.reserve(n);
long long cur;
cin >> cur;
ans.push_back(cur);
for (int i = 1; i < n; i++) {
long long x;
cin >> x;
if (x > cur) cur = x;
ans.push_back(cur);
}
for (int i = 0; i < n; i++) {
if (i) cout << ' ';
cout << ans[i];
}
cout << '\n';
return 0;
}
7. Код на Python 3
n = int(input())
a = list(map(int, input().split()))
ans = []
cur = a[0]
ans.append(cur)
for i in range(1, n):
if a[i] > cur:
cur = a[i]
ans.append(cur)
print(*ans)
Комментарии