Теория
Чтение текстового файла в список
В начале программы файл открывается, целые числа читаются генератором в список 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}
Задания для подготовки
Вводные задания
- Посчитайте количество всех пар и максимальное значение суммы в паре чисел в файле 17.txt. Пара – два идущих подряд элемента.
- Посчитайте количество всех пар и максимальное значение суммы в паре чисел в файле 17.txt. Пара – все возможные комбинации двух элементов в файле.
- Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, кратных 3
- Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, оканчивающихся на 3
- Дан файл 17.txt из чисел от -10000 до 10000. Посчитать количество элементов, которые больше чем среднее арифметическое всех четных значений исходной последовательности.
Простые
- https://kompege.ru/task?id=1970
- https://kompege.ru/task?id=1993
- https://kompege.ru/task?id=1995
- https://kompege.ru/task?id=1998
- https://kompege.ru/task?id=2003
Средние
- https://inf-ege.sdamgia.ru/problem?id=47014 Смотреть разбор (Excel)
- https://inf-ege.sdamgia.ru/problem?id=38951 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=37359 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=47221 Смотреть разбор
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6757 Смотреть разбор
- https://education.yandex.ru/ege/collections/a97d888a-5402-4044-bb08-35bcc66f9ec7/task/17 Смотреть разбор
- https://education.yandex.ru/ege/variants/c01534c6-0b3e-4da7-9d99-6c8d759babaf/task/17 Смотреть разбор
Сложные
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
