Задание № 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):
Проверили и получили ответ, совпадающий с ожидаемым. А значит, делаем вывод, что программа написана правильно. На входном файле (см. ссылка) получаем результат:
Таким образом, для успешного выполнения задания № 17 ЕГЭ по информатике нужно уметь считать данные из файла в список, знать цикл for, обрабатывать соседние (смежные) элементы с его помощью, а также владеть алгоритмом поиска максимума (минимума).
Ключом к успешному выполнению задания является разбиение одной задачи на 2 подзадачи, которые по отдельности решаются легче.