Редакция для Чётные и нечётные


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

Нужно пройти по всем кодам посылок и для каждого определить его чётность:

  • если число делится на 2 без остатка, увеличиваем количество посылок на чётном маршруте;
  • иначе увеличиваем количество посылок на нечётном маршруте.

В конце остаётся вывести два счётчика.

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

  1. Число является чётным, если x % 2 == 0.
  2. Иначе число нечётное.
  3. Неважно, положительное число, отрицательное или ноль:
    • 0 — чётное;
    • отрицательные числа тоже корректно проверяются по остатку от деления на 2.
  4. Достаточно одного прохода по массиву.

3. Алгоритм

  1. Считать число n.
  2. Завести два счётчика:
    • even_count — количество чётных чисел;
    • odd_count — количество нечётных чисел.
  3. Прочитать все n чисел.
  4. Для каждого числа x:
    • если x % 2 == 0, увеличить even_count;
    • иначе увеличить odd_count.
  5. Вывести even_count и odd_count.

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

Для каждого кода посылки существует ровно один из двух вариантов:

  • код чётный;
  • код нечётный.

Других случаев нет.
Проверка x % 2 == 0 точно определяет, делится ли число на 2 без остатка. Поэтому каждую посылку мы относим ровно к одному маршруту и учитываем в соответствующем счётчике.

После обработки всех n чисел:

  • even_count будет равен числу посылок с чётными кодами;
  • odd_count будет равен числу посылок с нечётными кодами.

Значит, алгоритм выводит правильный ответ.

5. Сложность

Для каждого из n чисел выполняется одна простая проверка.

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

6. Код на C++17

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int even_count = 0;
    int odd_count = 0;

    for (int i = 0; i < n; i++) {
        long long x;
        cin >> x;
        if (x % 2 == 0) {
            even_count++;
        } else {
            odd_count++;
        }
    }

    cout << even_count << " " << odd_count << "\n";
    return 0;
}

7. Код на Python 3

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

even_count = 0
odd_count = 0

for x in a:
    if x % 2 == 0:
        even_count += 1
    else:
        odd_count += 1

print(even_count, odd_count)

Комментарии

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