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