Редакция для Максимум по условию


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.

Автор: montes332

1. Идея

Нужно среди всех масс выбрать максимальную, но только среди чётных чисел.

Если хотя бы одно чётное число встретилось, запоминаем наибольшее из них.
Если ни одного чётного числа нет, выводим NO.

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

  • Яйцо считается годным тогда и только тогда, когда его масса чётная.
  • Значит, нечётные значения можно сразу пропускать.
  • Для поиска максимума не нужно хранить весь массив: достаточно по мере чтения поддерживать текущий лучший ответ.
  • Важно отдельно обработать случай, когда подходящих элементов нет совсем. Для этого удобно завести флаг found.

Почему нельзя просто начать с какого-нибудь очень маленького числа без флага?
Потому что в задаче требуется вывести NO, если чётных чисел нет. Значит, нужно уметь отличать ситуацию «максимум ещё не найден» от обычного числового значения.

3. Алгоритм

  1. Считать n.
  2. Считать все n масс.
  3. Завести:
    • found — найдено ли хотя бы одно чётное число;
    • mx — текущий максимум среди чётных.
  4. Для каждого числа x:
    • если x % 2 == 0, то число чётное;
    • если это первое найденное чётное число, записать mx = x и поставить found = True;
    • иначе, если x > mx, обновить максимум.
  5. После обработки всех чисел:
    • если found == True, вывести mx;
    • иначе вывести NO.

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

Рассмотрим, что происходит во время прохода по числам.

  • Мы проверяем каждое число ровно один раз.
  • Если число нечётное, оно не может быть ответом по условию задачи, поэтому его можно игнорировать.
  • Если число чётное:
    • при первом таком числе оно автоматически становится текущим максимумом среди всех увиденных чётных;
    • при каждом следующем чётном числе мы сравниваем его с текущим максимумом и оставляем большее.

Значит, после обработки всех элементов в mx будет храниться максимальная масса среди всех чётных чисел массива.

Если же ни одного чётного числа не встретилось, флаг found так и останется ложным, и тогда правильно вывести NO.

Следовательно, алгоритм всегда выдаёт верный ответ.

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;
    long long mx = 0;
    bool found = false;

    for (int i = 0; i < n; i++) {
        cin >> x;
        if (x % 2 == 0) {
            if (!found) {
                mx = x;
                found = true;
            } else if (x > mx) {
                mx = x;
            }
        }
    }

    if (found) {
        cout << mx << '\n';
    } else {
        cout << "NO\n";
    }

    return 0;
}

7. Код на Python 3

n = int(input())
a = list(map(int, input().split()))

found = False
mx = 0

for x in a:
    if x % 2 == 0:
        if not found:
            mx = x
            found = True
        elif x > mx:
            mx = x

if found:
    print(mx)
else:
    print("NO")

Комментарии

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