Задание 17 ЕГЭ по информатике. Обработка числовых последовательностей

Теория

Чтение текстового файла в список

В начале программы файл открывается, целые числа читаются генератором в список lines, в конце — файл закрывается: :contentReference[oaicite:1]{index=1}

f=open('17.txt')  # текстовый файл хранится в одной папке с программой
lines=[int(i) for i in f]
# ... (решение задачи)
f.close()

Определения (как используются в задачах)

  • Парой называется два идущих подряд элемента последовательности (если явно не оговорено иное). :contentReference[oaicite:2]{index=2}
  • Тройкой — три идущих подряд элемента последовательности. :contentReference[oaicite:3]{index=3}
  • Часто требуется вывести два числа: сначала количество найденных объектов, затем максимальную сумму элементов таких объектов.
Практические пометки (дополнение)
  • Если в условии сказано «пара — два различных элемента», то перебирают i < j, а порядок не важен (см. Задание 2).
  • При поиске максимумов удобно инициализировать «самый плохой» старт, например -20000 для чисел по модулю ≤ 10000.
  • Среднее по чётным элементам: сначала собрать чётные в отдельный список, затем sum/len (см. Задание 4).

Примеры решений заданий

Задание 1

Условие. В файле содержится последовательность целых чисел (от −10000 до 10000). Определите и запишите в ответе сначала количество пар подряд идущих элементов, в которых хотя бы одно число делится на 3, затем максимальную из сумм элементов таких пар. Пример для последовательности 6;2;9;−3;6 — ответ «4 11». :contentReference[oaicite:8]{index=8}

Решение

f=open('17.txt') # Открываем файл
lines=[int( i ) for  i  in f] # Через генератор читаем файл в массив
pair0=lines[0] # первый элемент пары - первый элемент в списке
maxpair =-20000 # переменная для максимальной суммы пары
countpair =0 # переменная для количества пар
for pair1 in lines[1:]: # перебор списка, начиная со второго элемента
    if pair0%3==0 or pair1%3==0: # проверка, делится ли хотя бы один элемент на 3
        sumpair =pair0+pair1 # сумма пары кратных 3
        countpair +=1 # увеличиваем счетчик количества пар
        if  sumpair > maxpair : # сравнение с текущим максимумом суммы
            maxpair = sumpair  # нашли новый максимум суммы
    pair0=pair1 # двигаем пару к следующему элементу
print( countpair,maxpair ) # печать результата
f.close () # закрываем файл

Задание 2

Условие. В файле последовательность из 10000 натуральных чисел (≤10000). Найдите: 1) число пар различных элементов, у которых разные остатки по модулю d=160 и хотя бы одно делится на p=7; 2) максимальную из сумм таких пар. Порядок в паре не важен. :contentReference[oaicite:10]{index=10}

Решение

f=open('17.txt')# Открываем файл
lines=[int( i ) for  i  in f]# Через генератор читаем файл в массив
lines2=lines[1:]# второй список, нужен для перебора всех возможных вариантов
maxpair =-20000# переменная для максимальной суммы пары
countpair =0# переменная для количества пар
for pair0 in lines:# перебор списка для выбора первого элемента пары
    for pair1 in lines2:# перебор списка для выбора второго элемента пары
        if (pair0%7==0 or pair1%7==0)and (pair0%160!=pair1%160):# проверка пары на условие задания
            sumpair =pair0+pair1# сумма пары
            countpair +=1# увеличиваем счетчик количества пар
            if  sumpair > maxpair :# сравнение с текущим максимумом суммы
                maxpair = maxpair if maxpair > sumpair else sumpair # (альтернатива) нашли новый максимум суммы
                # в презентации — просто maxpair = sumpair
    lines2=lines2[1:]# уменьшаем список перебора второго элемента
print( countpair,maxpair )# печать результата
f.close ()# закрываем файл

Задание 3

Условие. Файл содержит последовательность неотрицательных целых чисел (≤10000). Назовём тройкой три идущих подряд элемента. Определите количество троек, которые могут являться сторонами остроугольного треугольника. В ответе выведите: 1) количество таких троек; 2) максимальную сумму элементов таких троек. Если троек нет — выведите «0 0».

Решение

f=open('17.txt')# Открываем файл
lines=[int( i ) for  i  in f]# Через генератор читаем файл в массив
maxpair =-20000# переменная для максимальной суммы сторон
countpair =0# переменная для количества троек
for  i  in range( len (lines)-2):# перебор индексов списка
    maxside =max(lines[ i ],lines[i+1],lines[i+2]) # длинная сторона  тр -ка
    minside =min(lines[ i ],lines[i+1],lines[i+2]) # короткая сторона  тр -ка
    thirdside =(lines[ i ]+lines[i+1]+lines[i+2])- maxside-minside  # средняя сторона  тр -ка
    if  maxside **2<( minside **2+thirdside**2):# проверка на остроугольный тр -к sumpair = maxside+minside+thirdside # сумма сторон тр -ка countpair +=1# увеличиваем счетчик количества троек if sumpair > maxpair :# сравнение с текущим максимумом суммы
            maxpair = sumpair # нашли новый максимум суммы
print( countpair,maxpair )# печать результата
f.close ()# закрываем файл

Задание 4

Условие. Файл содержит последовательность неотрицательных целых чисел (≤10000). Назовём парой — два подряд идущих элемента. Нужно посчитать пары, в которых (1) хотя бы один делится на 3 и (2) хотя бы один меньше среднего арифметического всех чётных элементов последовательности. Вывести: 1) количество пар; 2) максимальную сумму элементов таких пар.

Решение

f=open('17.txt')# Открываем файл
lines=[int( i ) for  i  in f]# Через генератор читаем файл в массив
l2=[ i  for  i  in lines if i%2==0]# помещаем четные элементы в отдельный массив
average=sum(l2)/ len (l2)# считаем среднее арифметическое
pair0=lines[0]# первый элемент пары - первый элемент в списке
maxpair =-20000# переменная для максимальной суммы пары
countpair =0# переменная для количества пар
for pair1 in lines[1:]:# перебор списка, начиная со второго элемента
    if (pair0%3==0 or pair1%3==0) and (pair0<average or pair1<average):# проверка условия задачи
        sumpair =pair0+pair1# сумма пары 
        countpair +=1# увеличиваем счетчик количества пар
        if  sumpair > maxpair :# сравнение с текущим максимумом суммы
            maxpair = sumpair # нашли новый максимум суммы
    pair0=pair1# двигаем пару к следующему элементу
print( countpair,maxpair )# печать результата
f.close ()# закрываем файл

Задание 5

Условие. В файле последовательность целых чисел (от −10000 до 10000). Определите количество пар подряд идущих элементов, в которых только одно число оканчивается на 3, а сумма квадратов элементов пары не меньше квадрата максимального элемента последовательности, оканчивающегося на 3. Выведите: 1) количество таких пар; 2) максимальную из сумм квадратов элементов таких пар. :contentReference[oaicite:16]{index=16}

Решение

f=open('17.txt')# Открываем файл
lines=[int( i ) for  i  in f]# Через генератор читаем файл в массив
l2=[ i  for  i  in lines if i%10==3]# помещаем элементы оканчивающиеся на 3 в отдельный массив
maxel =max(l2)# считаем максимальный элемент с 3 в конце
print( maxel )
pair0=lines[0]# первый элемент пары - первый элемент в списке
maxpair =-20000# переменная для максимальной суммы пары
countpair =0# переменная для количества пар
for pair1 in lines[1:]:# перебор списка, начиная со второго элемента
    checkthree =(abs(pair0)%10==3 and abs(pair1)%10!=3) or (abs(pair0)%10!=3 and abs(pair1)%10==3)# проверка что только одно из чисел оканчивается на 3
    if  checkthree  and (pair0**2+pair1**2)>= maxel **2:# проверка условия задачи
        sumpair =pair0**2+pair1**2# сумма пары 
        countpair +=1# увеличиваем счетчик количества пар
        if  sumpair > maxpair :# сравнение с текущим максимумом суммы
            maxpair = sumpair # нашли новый максимум суммы
    pair0=pair1# двигаем пару к следующему элементу
print( countpair,maxpair )# печать результата
f.close ()# закрываем файл
Мини-советы к коду (дополнение)
  • Если список очень большой, двойной цикл (Задание 2) можно заменить на частотный учёт по остаткам (0..159) и отдельный учёт кратных 7 — это даёт O(n + d²). Но в учебном коде из презентации показан прямой перебор, что мы сохраняем. :contentReference[oaicite:18]{index=18}
  • При проверках «только одно оканчивается на 3» удобно использовать XOR-логику: (a%10==3) ^ (b%10==3); в презентации дана эквивалентная проверка через два условия. :contentReference[oaicite:19]{index=19}

Задания для подготовки

Вводные задания

  1. Посчитайте количество всех пар и максимальное значение суммы в паре чисел в файле 17.txt. Пара – два идущих подряд элемента.
  2. Посчитайте количество всех пар и максимальное значение суммы в паре чисел в файле 17.txt. Пара – все возможные комбинации двух элементов в файле.
  3. Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, кратных 3
  4. Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, оканчивающихся на 3
  5. Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, которые больше чем среднее арифметическое всех четных значений исходной последовательности.

Простые

Средние

Сложные

https://kompege.ru/task?id=14653

https://kompege.ru/task?id=12926

https://kompege.ru/task?id=9993

https://kompege.ru/task?id=9969

https://kompege.ru/task?id=9070

https://kompege.ru/task?id=7848

https://kompege.ru/task?id=7717

https://kompege.ru/task?id=5882

https://kompege.ru/task?id=5758

https://kompege.ru/task?id=4329

https://kompege.ru/task?id=3749

https://kompege.ru/task?id=3738

https://kompege.ru/task?id=3370

https://kompege.ru/task?id=2997

https://kompege.ru/task?id=2710

https://education.yandex.ru/ege/inf/task/d5802159-70ca-4d5d-832c-9856d41c15a6

https://education.yandex.ru/ege/inf/task/ad327404-5a19-4231-a238-c95270a529c3

https://education.yandex.ru/ege/inf/task/1c1fd299-2d3b-46e0-835d-a8416ecc37c8

https://education.yandex.ru/ege/inf/task/568e6793-fe55-44eb-8e94-17787b5a6853

 

 

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева