Путь олимпиадника

Как и обещал в предыдущем посте, размещаю следующий, в котором расскажу, как можно приобщиться к великому множеству олимпиадников, и дам начальные советы.
UPD: Следующий пост из серии.
Куда податься
ACM ICPC
Вообще говоря, если универ уже за плечами, или Вы учитесь в чём-нибудь крупном (вроде СПБГУ ИТМО,СПБГУ, Саратовского ГУ, Киевского ГУ, Уральского ГУ, и так далее— не правда, я не могу судить о других университетах, зная о своём — спасибо MikeMirzayanov), но раньше никогда не интересовались олимпиадами, то Вам практически точно нет пути на ACM ICPC. Почему? Ответ очевиден: если Вы уже не студент, то явно не можете участвовать в межвузовском соревновании. А если же вы учитесь в вузе, который хорошо себя проявлял ранее, то вас без малейшего зазрения совести отфутболят. А если и не отфутболят — то как у новичка у вас всё равно нет шансов против профи. Зато если ни под один из этих пунктов Вы не попадаете, то путь открыт; нужно только сходить в соответствующий отдел своего вуза и потребовать заявку на участие в ACM ICPC. Детальная и подробная информация о каждом из этапов олимпиады есть на официальном сайте NEERC.TopCoder
А вот тут может участвовать кто хочет: можно сказать, никаких ограничений! Помимо «свободного входа» TopCoder отличается разносторонностью: соревнования проходят во многих областях, и довольно часто можно получить неплохие денежные призы, даже не занимая первое место. Полный перечень направлений доступен на странице информации.Прочие художества
Помимо уже перечисленного есть много других контестов вроде Google Code Jam и UVa. Кстати, никто не мешает участвовать во всём сразу. Или не во всём, смотря что понравится.
Как научиться
Глупо надеяться, что Вы внезапно, словно по мановению НЛО, будете занимать первые места. Ключ к успеху лежит в постоянных тренировках; им следут посвящать около двадцати-тридцати часов в неделю, а то и больше. В первую очередь нужно озаботиться соответствующей литературой: Вашим альманахом должен стать Кормен, а с ним вместе и Кнут. Из онлайн-ресурсов могу порекламировать Algolist, e-maxx и Computer Algorithm Tutor. Последний ресурс особо примечателен тем, что содержит много визуализаторов для алгоритмов. Но, пожалуйста, поосторожнее с хабраэффектом: сайт крутится на довольно стареньком Pentium-IV.Разумеется, что зубрёж теории делу поможет совсем чуть-чуть, поэтому нужно ещё и практиковаться. В этом деле хорошим помощником окажется замечательное творение Уральского ГУ — Тимус. Там вы можете выбрать задачу из очень большой базы(около семисот штук) и решать её. Оценивание производится по правилам ACM ICPC. Timus Очень популярен, и не только среди отечественных программистов: всего в рейтинге участвует свыше сорока тысяч человек из самых разных стран. Также режим практики есть и на TopCoder, который был упомянут раньше.
На чём писать
Выбор языков в олимпиадах стандартный: C/C++, Java, Pascal. В некоторых олимпиадах его расширяют Delphi, C#, и даже некоторыми функциональными языками вроде Haskell или OCaml. Казалось бы: раз выбор широк, почему я не могу всегда писать на своём любимом языке? А вот почему: в контесте одним из самых важных параметров является то, как быстро Вы пишете решение. А теперь подумайте: если нужно косвенно реализовать дерево, то что лучше: голый Pascal или Java, в которой есть замечательный TreeSet? А вот другой случай: ограничение по памяти крайне мало (кстати, вот пример такой задачи, её я планирую довольно скоро разобрать). Разумеется, проще выбрать C/C++ или Pascal.Итак, получается, что писать нужно на всём. Даже более того, нужно прекрасно знать стандартные библиотеки всех тех языков, с которыми Вы собираетесь работать. Очень часто при решении задачи косвенно требуется использовать различные структуры данных или проводить сортировку. Чтобы не тратить время впустую, гораздо логичнее воспользоваться уже готовыми вариантами; тем более что вряд ли Вы напишите эффективнее. Однако это справедливо не всегда: скажем, ни в коем случае нельзя использовать
a.indexOf(b) в Java, где a и b — строки. Почему? Да потому что работает это чрезмерно долго, за O(n⋅m). Итак, вывод второй: нужно очень хорошо знать, насколько эффективно реализованна та или иная штучка в том или ином языке.Послесловие и обещания
Вот оно, первое напутствие в мир олимпиад. Следующим постом я планирую рассказать более подробно о преимуществах и недостатках различных языков, сопровождая это разбором нескольких классических задач. Кстати, некоторые трудящиеся просят рассказать и о том, как живётся ACM-щикам. Если остальные трудящиеся одобряют, то я могу сделать и это.P.S. Казалось бы, тема того, как олимпиадное программирование применимо или не применимо к программированию обычному отхабрена уже около девяти тысяч лет назад.



комментарии (72)