Чек-лист: олимпиадное программирование — с чего начать школьнику?
Олимпиадное или спортивное программирование — это участие в соревнованиях по решению нетривиальных алгоритмических задач. Оно позволяет получить фундаментальные знания, научиться эффективнее писать код и подготовиться к дальнейшей карьере — победителей и призеров олимпиад охотно нанимают ведущие IT-компании.
На старте
Программирование — это умение превращать объекты из реальных задач в абстрактные сущности и выражать их взаимодействие на языке программного кода. Поэтому главное условие для изучения программирования — абстрактное мышление, на которое сильно влияет уровень преподавания школьной математики.
Если вам интересно программирование, и у вас уже начало формироваться абстрактное мышление, с поддержкой увлечённого педагога довольно быстро освоите базовые знания, достаточные для участия в олимпиадах. Однако подготовиться к соревнованиям можно и самостоятельно, главное — сопровождать каждую пройденную тему, даже самую простую, усиленной практикой.
С чего начать?
Сперва нужно освоить какой-нибудь язык программирования. Например, раньше учебным языком был Pascal. Сейчас принято начинать с Python, который популярен среди тех, кто хочет быстро научиться писать код. Этот язык очень дружелюбный к начинающим, у него есть подробная и понятная документация и большое количество библиотек. Но чтобы продолжать участвовать в более сложных олимпиадах, надо будет рано или поздно овладеть C++.
Минимум тем, которые нужно изучить: переменные, операторы присваивания, логические и арифметические операции, условные операторы, потом — массивы и циклы, процедуры и функции. Для того, чтобы в них разобраться, можно, например, посмотреть курс Михаила Густокашина по C++ на Stepik. С этой базой можно решать первые олимпиадные задачи.
Как тренироваться?
Для программирования в первую очередь важна практика, хотя оно требует и теоретической подготовки. Это как водить машину: правила движения можно изучить и в классе автошколы, но научиться ездить можно только сидя за рулём автомобиля.
Я думаю, есть два основных способа выучить программирование:
- «Задачное» обучение — изучение конструкции языка через решение абстрактных задач. Например, когда надо прочитать все числа из файла и подсчитать сумму нечетных.
- Проектное обучение, при котором учащийся получает наглядный результат своей работы, небольшой работающий «продукт».
Олимпиадное программирование хорошо тем, что практиковаться можно и самостоятельно, без помощи преподавателя. Есть платформы, на которых доступно большое количество олимпиадных задач. Решаешь задачу, пишешь код, отправляешь его на проверку и тут же получаешь результат. Мгновенная обратная связь мотивирует продолжать заниматься программированием.
Например, есть сайт «Информатикс», созданный коллективом московских преподавателей олимпиадной информатики. На нём есть и теоретические материалы: например, вводные лекции по Python, к которым прикреплены примеры олимпиадных задач.
Самая популярная платформа для решения задач — это codeforces.com, которую создал и активно развивает Михаил Мирзаянов. На ней постоянно проводятся контесты (соревнования), открытые для всех желающих. Они рассчитаны на людей с разным уровнем: от тех, кто только вчера узнал базовые конструкции языка, до настоящих профессионалов, которые выигрывали международные соревнования и занимаются спортивным программированием уже много лет.
Путь к успеху — решать, решать, а потом ещё немного решать. Регулярно писать контесты — хотя бы один раз в неделю, а лучше два. Если решение задачи после долгих раздумий так и не нашлось, читайте её разбор.
Когда сталкиваетесь с незнакомым алгоритмом — знакомьтесь с ним, смотрите лекции на эту тему, изучайте статьи, форумы и книги. Например, «Алгоритмы: построение и анализ» Томаса Кормена и соавторов. Так выглядят дни тех, кто занимается олимпиадным программированием уже профессионально.
А ещё решать задачи гораздо приятнее и полезнее в команде. Ребята, которые занимаются в сообществе, как правило, достигают больших успехов.
Продолжение обучения
Когда человек освоил базу и знает конструкции языка, ему пора идти дальше: углубленно изучать теорию и разнообразные алгоритмы, которые позволяют по-новому работать с уже известными комбинаторными объектами. Знать алгоритмы и уметь применять сложные трюки — это хорошо, но задача никогда не состоит только из применения готовых знаний. Надо уметь сопоставлять разные параметры, вспоминать алгоритмы и модифицировать их для дальнейшего применения.
В любой задаче есть своя уникальная идея — даже если ты видел до этого тысячу других идей и задач, то 1001-я всё равно будет новой.
До многих вещей можно дойти самостоятельно, но проще и быстрее будет, если знающие люди расскажут готовые способы решения. Самый действенный путь — общаться с единомышленниками и посещать места, где делятся знаниями и опытом: выездные школы и сборы. Например, есть смена «Алгоритмы и анализ данных» в «Сириусе», где много времени уделяется тому, чтобы помочь ребятам прокачать необходимые навыки для участия в олимпиадах по информатике. Поищите и регулярные занятия, которые можно посещать круглый год: например, кружки олимпиадного программирования, которые работают в вашем городе.
Самостоятельное обучение по книгам и материалам из интернета — это длинный и сложный путь, хотя поиск самой информации и не составит труда. В частности, на сайте MAXimal собраны 145 алгоритмов для решения разных задач, а также в открытом доступе опубликованы книги по алгоритмам, оптимизации, С++ и Java.
Тактическое преимущество
Чтобы эффективно выполнять задачи, надо понимать, решение каких из них принесет наибольшую пользу в будущем.
Я подразделяю задачи на четыре уровня сложности:
- Первый уровень: даже не замечаешь, как решил задачу. Решение приходит в голову сразу же, как только прочитал условие. Это бесполезные с точки зрения опыта задачи, хотя их и можно встретить на олимпиаде. Если есть возможность их не решать — не решайте.
- Второй уровень: задание вызывает небольшое напряжение. Сходу его не решить, хотя и примерно ясно, в каком направлении нужно двигаться. На такие задания уходит минут 5-15. Подумал, попробовал наиболее очевидный вариант решения или два — и решил.
- Четвёртый уровень: не для тебя (пока). Например, ты семиклассник, а для решения задачи нужны знания университетских математических формул и громоздких алгоритмов. Прочитал разбор и всё равно вообще ничего не понял. Ты можешь попытаться разобраться и в итоге выполнить это задание, потратив колоссальное время, но получится неэффективно для общего результата.
На смене в «Сириусе» ребята, например, решали такие задачи:
Задача 1. Еловая аллея
Задача 2. Петя и снегоуборочная машина
Ошибки при подготовке к олимпиаде
Ударяться в крайности. «Я всегда дохожу до решения сам и никогда никуда не подсматриваю. Если мне нужно будет потратить три недели, чтобы решить задачу, то я потрачу три недели». До всего доходить самостоятельно — это круто, но неэффективно. К тому же, этот путь потребует слишком много силы воли, которая редко у кого встречается, а также может привести к выгоранию и утрате мотивации.
Тут же сдаваться. «Если я не понял, как решать задачу за 15 минут, то я узнаю, как она решается, прочитав её разбор». При помощи ресурса Codeforces, про который я говорил выше, можно узнать, как автор видел решение этой задачи, и как эту задачу решили бы другие люди.
Решать только те задачи, которые нравятся. В олимпиадном программировании существуют разные типы задач: некоторые требуют в первую очередь развитого математического аппарата (например, знания теории чисел), в других идёт упор на написание кода, в-третьих — на математику (системы уравнений, теория чисел), а иногда — комбинаторику (графы). Углубляться всегда надо в те области, где возникло сопротивление. Для успеха на соревнованиях полезнее решить пять задач на нелюбимую тему, чем на ту, которая легко даётся.
Не уделять достаточно внимания коду. В процессе написания программы наброски решения переводятся на формальный язык. Иногда ты за пять минут находишь решение и потом пару часов пишешь код, а бывает и наоборот. Писать код так, чтобы в нём было меньше ошибок, способность эти ошибки находить и исправлять — навык, который можно и нужно нарабатывать.
Чем больше пишешь код, тем лучше начинаешь это делать. Также полезно обсуждать с другими людьми, как писать программы с меньшим количеством ошибок и читать чужой код.Что дают олимпиады?
- Льготы при поступлении. Есть линейка всероссийских предметных олимпиад, диплом которых — билет в вуз на бюджетное место.
- Олимпиадный опыт помогает проходить собеседования в крупные компании, так как на них очень часто дают олимпиадные задачи.
- Призовое место — это весомое дополнение к любому портфолио и резюме. Перспектива повышать уровень олимпиадного программирования и дальше, поехать на международные соревнования. Например, на международный чемпионат по алгоритмическому программированию ICPC, который считается самым престижным соревнованием в мире.
- Возможность попасть в специальные летние или зимние школы, на сборы, в проекты вроде «Сириуса», и стать частью сплоченного сообщества.
- Даже если вы не будете занимать призовые места на олимпиадах, участие в них позволит набраться фундаментальных знаний и опыта разработки, разовьёт умение размышлять.
Фото на обложке: Unsplash
Принцип Паскаля — проблемы и решения
от Александра Сан -Лохат
1. Известно:
Площадь 1 = 10 см 2
Область 2 = 100 CM 2 2
Сила 2 (F 2 ) = 100 Newton
Разыскивается: Force 1 (F 1 )
Решение:
P = F / A
P = P = 37 давление
P 1 = F 1 / A 1
P 2 = F 2 / a 2
P 1 = P 2
F 1 / A 1 = F 2 / A 2
F 1 /10 CM 2 = 100 Н/100 см 2
F 1 /10 = 1 N
F 1 = (10) (1 N)
F 1 = 10 Newton
[IRP]
2. Если область a 1 = 0,001 м 2 и площадь A 2 = 0,1 м 2 , внешняя входная сила F 1 = 100 Н, тогда внешняя выходная сила F 2 ?
Известно:
Площадь А 1 = 0,001 м 2
Площадь А 2 = 0,1 м 2
Внешнее входное силу F 1 = 100 Newton
Разыскивается : Внешний выходной сигнал (F 2 )
Решение:
P 1 . = P 2
F 1 / A 1 = F 2 / A 2
100 N / 0,001 M 2 = F 2 / 0,1 M 2
100 N / 0,001 = Ф 2 / 0,1
100 000 n = F 2 / 0,1
F 2 = (0,1) (100 000 N)
F 2 = 10 000 N
[IRP]
3. Вес автомобиля = 16 000 Н. внешняя входная сила F…
Известно:
Масса автомобиля (w) = 16 000 Н
Площадь B (A B ) = 4000 см 2 = 40 10 20 2000 / 10,0012 10 м 2 = 0,4 м 2
Площадь A (A A ) = 50 см 2 = 50/1000000 м 2 = 0,005 M 2
Разыскивается: FIRCH F
Решение:
F / A A = W / A B
F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / F / A 0,005 М 2 = 16 000 Н / 0,4 м 2
F / 0,005 = 16 000 Н / 0,4
F / 0,005 = 40 000 N
F = (40 000 Н) (0,005)
F = 200
4.
Площадь А составляет 60 см 2 и площадь В составляет 4 200 см 2 , определить внешнюю входную силу F.
Известно :
Площадь A (A A ) = 60 см 2
см 2
Вес w (W) = 3500 Newton
Разыскивается: F 1
Решение:
Сила F Расчет с использованием уравнения принципа Паскаля:
F 1 / a 999 1 = Ф 2 / А 2
F 1 /60 см 2 = 3500 Н / 4200 см 2
F 1 /60 = 35 N / 42
F 1 = (60) (35). / 42
F 1 = 2100 / 42
F 1 = 50 ньютонов
5. Гидравлический подъемник имеет большое поперечное сечение и малое поперечное сечение. Большая площадь поперечного сечения в 20 раз больше малой площади поперечного сечения. Если на малое сечение приложена входная сила 25 Н, то определить выходную силу.
Известно:
Небольшая площадь поперечного сечения (A 1 ) = A
Большая площадь поперечного сечения (A 2 ) = 20A
Входная сила (F 1 ) = 25 N
Разыскивается: Выходная сила (F 2 )
Решение:
Давление и принцип Паскаля в физических задачах
. 2016
Из книги: Физика I: 501 практических задач для чайников (+ бесплатная онлайн-практика)
Физика I: 501 практических задач для чайников (+ бесплатная онлайн-практика)
Исследовать книгу Купить на Amazon
Использование физики, вы можете применить принцип Паскаля, чтобы определить, как работают гидравлические системы. Например, можно рассчитать, как размер поршня влияет на давление другого поршня в той же системе.
Вот несколько практических вопросов, которые вы можете попробовать.
Практические вопросы
В гидравлической системе поршень площадью поперечного сечения 21 квадратный сантиметр давит на несжимаемую жидкость с силой 38 ньютонов. Дальний конец гидравлической трубы соединяется со вторым поршнем с площадью поперечного сечения 100 квадратных сантиметров. Какая сила действует на второй поршень?
Рассмотрим гидравлическую систему с двумя поршнями. Поршень 1 прикладывает усилие F 1 к площади A 1 и поршень 2 прикладывает силу F 2 к площади A 2 .
Если удвоить силу, действующую на поршень 1, и уменьшить площадь поршня 2 в 3 раза, какова новая сила
?по первоначальной силе F 2 ?
Поршень, являющийся частью гидравлической системы, имеет площадь поверхности 0,025 квадратных метра.
Ответы
Ниже приведены ответы на практические вопросы:
1.
Принцип Паскаля дает
В этом случае вы знаете, что
Решите уравнение для
и подставьте данные значения, чтобы найти силу, действующую на второй поршень:
Применить принцип Паскаля к новой системе (другими словами, применить его после того, как F 1 удвоится и A 2 уменьшается в 3 раза). Используя штрихи для обозначения новых количеств, у вас есть
Вы знаете, что
, где нештрихованные количества являются исходными количествами. Используйте эти уравнения в предыдущем уравнении и найдите
.20 000 Па
Согласно принципу Паскаля изменение давления в закрытой системе одинаково во всей системе. Поэтому давление на любой поршень в системе одинаковое: 20 000 паскалей.