Чему научитесь
- Определять по условию, какой приём нужен, без подсказки соседней теории
- Соединять в одной задаче условия, циклы и разбор числа
- Узнавать свои типичные ошибки по вердикту, а не перебором правок
- Проверять себя срезом из шести задач перед новым модулем
Как устроено занятие
Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.
Дальше 15 задач лестницей: разминка, основа, со звёздочкой. Занятие засчитывается, когда решено 10 — остальные не пропадают и учитываются отдельно.
После практикума — контрольная: шесть задач по всему пройденному, по одной на каждую крупную тему. Подсказок там нет.
Сколько это займёт
Примерно час-полтора вместе с задачами. Сроков нет: можно закрыть вкладку и вернуться когда удобно — прогресс сохранится.
Что вы теперь умеете
За одиннадцать занятий набрался инструмент, которого хватает на большую часть школьных олимпиадных задач начального уровня. Новой темы сегодня не будет — будет проверка, что всё это работает вместе.
Главная сложность практикума в том, что тема не подписана. Раньше задача стояла сразу после разбора, и было понятно, что применять. Теперь нет, и первый шаг — понять по условию, какой приём нужен.
Признаки, по которым это видно:
| что сказано в условии | что нужно |
|---|---|
| «даны два-три числа» | одни вычисления и условия, цикл не нужен |
| «числа от до », «первые чисел» | for по промежутку |
| «дано чисел» | for и накопитель: сумма, счётчик, максимум |
| «ввод заканчивается нулём», «пока не станет» | while |
| «цифры числа», «запись числа», «палиндром» | разбор через % 10 и // 10 |
| «сколько пар», «таблица», «фигура» | вложенные циклы |
Часто в одной задаче встречается сразу два признака: перебрать числа от 1 до и у каждого посмотреть цифры — это for снаружи и разбор внутри. Такие задачи и составляют практикум.
Проверка: какой приём нужен
Условие: «вводятся числа, ввод заканчивается нулём; найдите, сколько среди них чисел с суммой цифр больше 10».
Что здесь понадобится?
Одиннадцать ошибок, на которых теряют время
Все они уже встречались. Здесь они собраны вместе — вместе с признаком, по которому ошибка узнаётся, не перечитывая код целиком.
Ввод и вычисления
- Числа в одной строке прочитаны как в разных — или наоборот. Признак: программа падает на первом же тесте.
- Обычное деление вместо целочисленного. Признак: в ответе
.0или дробь там, где ждали целое. - Порядок сравнений в цепочке
if — elifперепутан, и более общее условие стоит раньше частного. Признак: часть случаев не срабатывает никогда.
Циклы
range(1, n)вместоrange(1, n + 1). Признак: ответ почти верный, ошибка ровно на границе.- Накопитель заведён внутри цикла. Признак: ответ равен вкладу последнего элемента.
printвнутри цикла вместо после. Признак: вместо одного числа — целая история накопления.- Максимум начат с нуля. Признак: на отрицательных данных ответ 0.
- Переменная из условия
whileне меняется в теле. Признак: превышение времени. Не ускоряйте — ищите пропущенную строку.
Числа и перебор
- Ноль не обработан:
while n > 0на нуле не выполняется ни разу. - Исходное число потеряно разбором — копию надо делать до цикла.
- Двойной цикл там, где данных слишком много. Признак: превышение времени при верном решении. Перемножьте длины циклов до отправки.
Проверка: пройдёт ли по времени
В задаче до , и решение перебирает все пары — то есть делает шагов.
Сколько это миллиардов операций? Введите целое число.
Если задача не идёт — куда вернуться
Практикум устроен так, что каждая задача опирается на конкретное занятие. Если видите, что приём не вспоминается, — возвращайтесь точечно, а не перечитывайте всё подряд.
| не получается | вернитесь к занятию |
|---|---|
| разобрать случаи, выбрать из нескольких вариантов | 5 и 6 — условия |
| перебрать числа отрезка, не потеряв границу | 7 — for и range |
| посчитать сумму, количество, максимум по потоку | 8 — накопление |
| читать до признака конца, завершить цикл | 9 — while |
| достать цифры, собрать число обратно | 10 — разбор числа |
| перебрать пары, оценить объём работы | 11 — вложенные циклы |
Порядок работы
Сначала практикум — пятнадцать задач с подсказками про то, где смотреть. Потом контрольная — шесть задач без подсказок вовсе.
Смысл именно в таком порядке: практикум показывает, что подзабылось, и это можно закрыть до среза. Контрольная не для оценки, а для ответа на один вопрос — можно ли идти дальше, в модуль про строки.
Практикум: пятнадцать задач
Лестница прежняя: пять разминочных, семь основных, три со звёздочкой. Зачёт при десяти решённых.
Темы перемешаны намеренно, и рядом стоящие задачи почти никогда не про одно и то же. Если сходу непонятно, с чего начать, — вернитесь к таблице признаков в первом блоке.
Подсказки в условиях остались, но они теперь другие: не «сделайте так», а «здесь стоит вспомнить вот это».
Две ошибки из разных тем
Задача: «вводятся числа, ввод заканчивается нулём; найдите наибольшее из них и количество чисел с чётной суммой цифр».
Ученик написал:
best = 0
count = 0
x = int(input())
while x != 0:
if x > best:
best = x
s = 0
while x > 0:
s += x % 10
x //= 10
if s % 2 == 0:
count += 1
x = int(input())
print(best, count)
Программа работает, но отвечает неверно. Найдите обе ошибки — они из разных тем — и объясните, что программа выведет на входе −4, −2, 0.