Задача к ЕГЭ по информатике на тему «прочие прототипы» №8

Задание выполняется с использованием прилагаемых файлов

В текстовом файле записан набор натуральных чисел, не превышающих 109.  Гарантируется, что все числа различны. Необходимо определить, сколько в наборе таких пар чисел, что числа в паре имеют разную чётность, а их сумма тоже присутствует в файле, и чему равна наименьшая из сумм таких пар.

Входные данные.

Первая строка входного файла содержит целое число N  — общее количество чисел в наборе. Каждая из следующих N  строк содержит одно число. В ответе запишите два целых числа: сначала количество пар, затем наименьшую сумму.

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

Пример входных данных:

6

4

8

13

19

23

21

В данном случае есть две подходящие пары: 8  и 13  (сумма 21  ), 4  и 19  (сумма 23  ).

В ответе надо записать числа 2  и 21  .

Неэффективное решение (в рамках этого задания), через бин. поиск

def bin_search(a, x):
    n = len(a)
    left = -1
    right = n
    while right - left > 1:
        middle = (left + right) // 2
        if a[middle] >= x:
            right = middle
        else:
            left = middle
    if right != n and a[right] == x:
        return True
    else:
        return False

f = open(’1.txt’)
n = int(f.readline())
a, odd, even = [], [], []
counter = 0
min_summ = 10 ** 10
for i in range(n):
    x = int(f.readline())
    if x % 2 == 0:
        even.append(x)
    else:
        odd.append(x)
    a.append(x)
a = sorted(list(set(a)))  # Уменьшаем количество элементов до уникальных
for i in odd:
    for j in even:
        if bin_search(a, i + j):
            counter += 1
            min_summ = min(min_summ, i + j)
print(counter, min_summ)

Эффективное решение через проход по множеству (поиск в среднем происходит за 1 операцию).

f = open(’task 5.txt’)
n = int(f.readline())
a, odd, even = [], [], []
counter = 0
min_summ = 10 ** 10
for i in range(n):
    x = int(f.readline())
    if x % 2 == 0:
        even.append(x)
    else:
        odd.append(x)
    a.append(x)
a = set(a)  # Перебор (in) идет за O(n)
for i in odd:
    for j in even:
        if (i + j) in a:
            counter += 1
            min_summ = min(min_summ, i + j)
print(counter, min_summ)

Ответ: 3380470 271
Оцените статью
Я решу все!