Разбор задания № 17 к ЕГЭ по информатике

Задание № 17 к ЕГЭ по информатике претерпело изменения и усложнилось по сравнению с аналогичным заданием прошлого года.

Если в заданиях № 17 раньше обрабатывался i-ый элемент последовательности, то в заданиях этого учебного года требуется обработать пару соседних элементов.

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно.

Определите и запишите в ответе сначала количество пар элементов последовательности, в которых сумма квадратов элементов пары имеет нечетное значение, превосходящее 90, затем среди таких пар определите пару с минимальной суммой элементов и запишите максимальное из чисел в ней (если пар с минимальной суммой элементов несколько, то в ответ следует выбрать максимальное число из последней пары).

В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например, для последовательности из пяти элементов: 10; 5; 10; -3; 1 ответ будет 3; 10.

Задание будем решать на языке программирования Python.

Для начала считаем все данные в список:

f = open('17.txt', 'r')# открыли файл в режиме чтения
data = [int(x) for x in f.read().split()] # формируем через списочное выражение список чисел
print(data) # вывод промежуточного результата (для проверки кода)

В данной задаче можно выделить 2 подзадачи. По условию первой подзадачи мы должны подсчитать количество пар элементов последовательности, в которых сумма квадратов элементов пары имеет нечетное значение, превосходящее 90.

Как обработать пару? Можно в цикле «проходить» от начального (нулевого) элемента до предпоследнего. И в качестве пары рассматривать элементы с индексами i, i + 1. Если мы в цикле будем идти до последнего элемента.

То программа завершится с ошибкой, т.к. мы обратимся к несуществующему элементу списка. Считываем в переменные first и second квадраты чисел с индексами i, i + 1. Делаем проверку согласно условию задания. Если сумма квадратов нечетна и превышает 90, то счетчик count, хранящий первый ответ, увеличь на 1:

count = 0 # инициализация результата
for i in range(len(data) - 1):
    first = data[i] ** 2
    second = data[i + 1] ** 2
    summ_sq = first + second
    if summ_sq % 2 == 1 and summ_sq > 90:
        count += 1

Решим вторую подзадачу, которая логически вытекает из первой. Теперь из отобранных пар нужно найти пару с наименьшей суммой. Чтобы найти такую пару, следует создать переменную, например, min_sum, которая будет хранить эту наименьшую сумму и задать ей в начале самое большое возможное значение.

Кроме того заведем переменную tek_sum, которая будет хранить текущую проверяемую сумму. Если текущая сумма меньше минимальной, тогда перезаписываем минимальную сумму и сохраняем оба числа, представляющие пару. В задаче есть еще один нюанс. Если пар с минимальной суммой элементов несколько, то в ответ следует выбрать максимальное число из последней пары. Если поставить просто знак «<» при сравнении:

if tek_sum < min_sum:
    min_sum = tek_sum
    min_a = data[i]
    min_b = data[i + 1]

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

if tek_sum <= min_sum: #для поиска последней минимальной пары
    min_sum = tek_sum
    min_a = data[i]
    min_b = data[i + 1]

Теперь объединяем два решения в одно. Полная программа выглядит так:

f = open('17.txt', 'r')
data = [int(x) for x in f.read().split()]
count = 0 # счетчик для подсчета количества пар
min_sum = 99999999 # задаем наибольшее возможное значение
for i in range(len(data) - 1):
    first = data[i] ** 2
    second = data[i + 1] ** 2
    summ_sq = first + second
    if summ_sq % 2 == 1 and summ_sq > 90:
        count += 1
        tek_sum = data[i] + data[i + 1]
            if tek_sum <= min_sum: # поиск последней пары с минимальной суммой
            min_sum = tek_sum
            min_a = data[i]
            min_b = data[i + 1]

print(count)
print(max(min_a, min_b))

Написанную программу следует обязательно проверить не только на заданном тесте, но и придумать хотя бы один свой тест для предотвращения ошибок.
Подбираем, к примеру, тест: 6, 8, 9, 12, 7, 1.

Ожидаем результат (3 подходящие пары и выбираем по минимальной подходящей сумме пару 8, 9):

  • 3 (общее число подходящих пар)
  • 9 (максимальное число в последней паре с минимальной суммой среди отобранных)

Проверили и получили ответ, совпадающий с ожидаемым. А значит, делаем вывод, что программа написана правильно. На входном файле (см. ссылка) получаем результат:

  • 3070 (общее число подходящих пар);
  • -9561 (максимальное число в последней паре с минимальной суммой среди отобранных).

Таким образом, для успешного выполнения задания № 17 ЕГЭ по информатике нужно уметь считать данные из файла в список, знать цикл for, обрабатывать соседние (смежные) элементы с его помощью, а также владеть алгоритмом поиска максимума (минимума).

Ключом к успешному выполнению задания является разбиение одной задачи на 2 подзадачи, которые по отдельности решаются легче.

Чтобы скачать материал зарегистрируйтесь или войдите!

Метки к статье: ЕГЭ, информатика, 11 класс