Редакция для Сколько раз встречается максимум


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. Идея

Нужно найти максимальный балл среди всех работ и посчитать, сколько раз он встречается.

Самый простой способ — просматривать числа по очереди и поддерживать две величины:

  • mx — текущий максимальный балл,
  • cnt — сколько раз этот максимум уже встретился.

Когда читаем очередное число:

  • если оно больше mx, значит найден новый максимум, тогда mx обновляется, а cnt становится равным 1;
  • если оно равно mx, увеличиваем cnt;
  • если оно меньше mx, ничего делать не нужно.

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

  1. Не нужно отдельно искать максимум, а потом ещё раз считать его количество.
    Всё можно сделать за один проход по массиву.

  2. Первый элемент удобно взять как начальный максимум:

    • mx = a[0]
    • cnt = 1
  3. После этого остаётся пройти по остальным элементам и обновлять ответ по описанным правилам.

Например, для массива 1 3 3 2 3:

  • сначала mx = 1, cnt = 1
  • видим 3: это новый максимум, теперь mx = 3, cnt = 1
  • видим 3: равно максимуму, cnt = 2
  • видим 2: меньше максимума, ничего не меняется
  • видим 3: равно максимуму, cnt = 3

Ответ: 3.

3. Алгоритм

  1. Считать n.
  2. Считать все n чисел.
  3. Присвоить:
    • mx = первый элемент
    • cnt = 1
  4. Для каждого элемента, начиная со второго:
    • если элемент больше mx, то:
      • mx = элемент
      • cnt = 1
    • иначе если элемент равен mx, то:
      • cnt += 1
  5. Вывести cnt.

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

Докажем, что после обработки очередных элементов массива:

  • mx равен максимуму среди уже просмотренных элементов;
  • cnt равен количеству вхождений этого максимума среди уже просмотренных элементов.

Изначально после первого элемента это верно:

  • максимум среди одного элемента равен самому этому элементу;
  • встречается он ровно один раз.

Теперь рассмотрим следующий элемент:

  • Если он больше mx, то старый максимум больше не актуален. Новый максимум — этот элемент, и среди уже просмотренных элементов он пока встретился один раз. Значит, нужно сделать mx = текущий элемент, cnt = 1.
  • Если он равен mx, то максимум не меняется, но его количество увеличивается на 1.
  • Если он меньше mx, то ни максимум, ни число его вхождений не меняются.

Значит, после обработки каждого элемента утверждение остаётся верным. Тогда после обработки всего массива cnt и будет количеством работ, набравших максимальный балл.

5. Сложность

  • Время: O(n), потому что массив просматривается один раз.
  • Память:
    • для приведённого решения на C++: O(1), так как числа можно обрабатывать по мере чтения;
    • для приведённого решения на Python: O(n), так как весь массив считывается в список.

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)

Комментарии

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