EduBrick
классная работа

Как устроена олимпиадная задача. Первая программа

Программирование на Python: от нуля до олимпиад

0/20решено 0 из 20до зачёта осталось 10

Чему научитесь

  • Понимать, чего от вас хочет проверяющая система и почему она не читает пояснений
  • Читать условие по частям и не терять формат вывода
  • Писать программу, которая читает данные, считает и печатает ответ
  • Отличать строку от числа — и не получать 34 вместо 7

Как устроено занятие

Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.

Дальше 15 задач лестницей: разминка, основа, со звёздочкой. Занятие засчитывается, когда решено 10 — остальные не пропадают и учитываются отдельно.

После занятия — вторая часть, ещё 15 задач на те же приёмы в новых сюжетах.

Сколько это займёт

Примерно час-полтора вместе с задачами. Сроков нет: можно закрыть вкладку и вернуться когда удобно — прогресс сохранится.

теория

Чем олимпиадная задача отличается от школьной

Школьная задача заканчивается ответом в тетради: «12 километров». Олимпиадная заканчивается программой, которая даст верный ответ на любых данных — в том числе на тех, которых вы не видели.

Это принципиально другая работа. Вас просят не посчитать, а описать способ подсчёта. Проверять его будет не человек, а робот, и делать он это будет так:

  1. запустит вашу программу и подсунет ей заранее заготовленные данные;
  2. прочитает то, что программа напечатала;
  3. сравнит с правильным ответом — символ за символом;
  4. повторит это на десятке разных наборов данных, которые называют тестами.

Если хотя бы на одном тесте вывод отличается — задача не зачтена. Робот не догадывается, что вы «почти правы», и не читает ваших пояснений: он сравнивает текст.

Отсюда правило, которое стоит принять сразу: программа не разговаривает с человеком. Никаких «Введите число», «Ответ:», «Спасибо за использование». Только то, что просят в разделе «Формат вывода».

теория

Как читать условие

Условие любой задачи состоит из одних и тех же частей, и читать их надо в определённом порядке.

часть что там зачем читать
Условие сюжет и что найти понять, какой ответ требуется
Формат ввода сколько чисел, в каком порядке, в каких строках написать чтение данных
Формат вывода что и как печатать не потерять баллы на оформлении
Ограничения границы значений выбрать подход и типы
Пример один набор данных и ответ на него проверить себя руками

Пример в условии — не проверка правильности. Это образец формата. Тестов у робота десяток, и они специально устроены сложнее примера: там будут ноль, единица, максимальные значения и прочие крайние случаи.

Полезная привычка: прочитав условие, ответьте себе на три вопроса вслух — что дано, что найти, что напечатать. Если на любой из трёх ответа нет, вы ещё не поняли задачу, и писать код рано.

тест

Проверка: пример из условия

Ваша программа даёт верный ответ на примере из условия. Что это значит?

Войдите, чтобы ответить.
теория

Первая программа: три действия

Любая программа этого занятия делает три вещи по порядку: читает, считает, печатает.

s = input()      # прочитали строку
print(s)         # напечатали её обратно

Разберём построчно.

input() читает одну строку из входных данных и возвращает её. Никаких приглашений и подсказок он не печатает — и не должен.

sпеременная: имя, за которым лежит значение. Знак = здесь не равенство из математики, а действие: «вычисли справа, положи в то, что слева». Поэтому запись x = x + 1 вполне осмысленна — она увеличивает x на единицу.

print(s) печатает значение и переводит строку. Если передать несколько значений через запятую, они напечатаются через пробел:

print(4, 7)      # 4 7

Это ровно то, что просят, когда в условии написано «выведите два числа через пробел».

теория

Почему приходится писать int()

input() всегда возвращает строку, даже если во входных данных было число. Строка «3» и число 3 — разные вещи, и складываются они по-разному.

Со строками + означает склеивание:

a = input()      # "3"
b = input()      # "4"
print(a + b)     # 34, а не 7

Чтобы получить число, строку превращают функцией int():

a = int(input())
b = int(input())
print(a + b)     # 7

Если чисел несколько в одной строке, её сначала режут на части, а потом каждую превращают в число:

a, b, c = map(int, input().split())

Здесь split() делит строку по пробелам, а map(int, ...) применяет int к каждой части. Если чисел окажется не три, программа остановится с ошибкой — это признак, что формат ввода прочитан невнимательно.

Заодно запомните обратное превращение: str(5) даёт строку «5». Оно понадобится, когда ответ придётся собирать из текста и чисел.

тест

Проверка: что напечатает программа

Ввели две строки: 5 и 2. Что напечатает a = input(), b = input(), print(a + b)?

Войдите, чтобы ответить.
теория

Вычисления по формуле

Дальше в задачах будет одно и то же: прочитать числа, применить формулу, напечатать результат. Арифметика привычная, но два места требуют внимания.

Порядок действий. Python считает как математика: сначала умножение и деление, потом сложение и вычитание. Скобки меняют порядок.

P=2(a+b)p = 2 * (a + b)P = 2 \cdot (a + b) \quad\Longrightarrow\quad \texttt{p = 2 * (a + b)}

Без скобок 2 * a + b получилась бы другая формула — и другой ответ.

Что печатать. Если в условии просят два числа, печатайте ровно два и ровно в том порядке, в каком просят. «Сначала площадь, затем периметр» — значит print(s, p), а не наоборот.

Ниже — полное решение задачи про прямоугольник, целиком, как его стоит писать:

a, b = map(int, input().split())
s = a * b
p = 2 * (a + b)
print(s, p)

Четыре строки, и каждая делает одно понятное дело. Такой код проще проверять глазами, чем то же самое в одну строку.

расчёт

Проверка: порядок действий

Чему равно 2 * (3 + 4)? Введите целое число.

Войдите, чтобы ответить.
теория

Четыре ошибки, на которых спотыкаются все

Приглашение к вводу. input("Введите число: ") печатает текст, и робот считает его частью ответа. Просто input().

Забытый int(). Программа складывает строки вместо чисел. Признак — в ответе два числа, слепленных подряд: вместо 7 выходит 34.

Лишний вывод «для красоты». print("Ответ:", x) — это другой ответ. Печатайте только то, что просят.

Не тот порядок вывода. Если просят площадь и периметр, а вы печатаете периметр и площадь, ответ неверный, хотя оба числа посчитаны правильно.

Как проверять себя

Перед отправкой сделайте три вещи. Запустите программу у себя, введите данные из примера и сравните вывод с примером посимвольно. Затем подставьте самые маленькие допустимые значения из ограничений — часто это единица или ноль. И наконец самые большие: убедитесь, что программа не сломалась и ответ выглядит разумно.

Эти три проверки отсекают почти все неудачные посылки на первых занятиях.

короткий ответ

Проверка: превращение строки в число

Какой функцией строку "42" превращают в число 42? Напишите только имя функции.

Войдите, чтобы ответить.
теория

Практика: как устроена лестница

Дальше пятнадцать задач тремя ступенями.

  • разминка (5 задач по 1 баллу) — приём в чистом виде, без сюжета;
  • основа (7 задач по 2 балла) — тот же приём в прикладной обёртке;
  • со звёздочкой (3 задачи по 3 балла) — формула не дана, её нужно собрать самому.

Занятие зачтено, когда решено десять задач из пятнадцати. Решённое сверх нормы не пропадает — оно учитывается отдельно.

Сроков нет: курс проходится своим темпом. Но лучше идти по порядку — задачи разминки нужны как кирпичи для остальных.

лестница задач
развёрнутый ответ

Объясните, почему решение не зачли

Ученик решал задачу «выведите площадь и периметр прямоугольника» и написал:

a = input()
b = input()
print("Площадь:", a * b)

Программа не работает. Найдите все ошибки — их здесь три — и объясните, к чему приводит каждая.

Войдите, чтобы ответить.