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