Спортивное программирование

индекс
148,80

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

*Тут должна быть сопутствующая картинка, но хабраэффект убил её хранилище(*
Как и обещал в предыдущем посте, размещаю следующий, в котором расскажу, как можно приобщиться к великому множеству олимпиадников, и дам начальные советы.
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. Казалось бы, тема того, как олимпиадное программирование применимо или не применимо к программированию обычному отхабрена уже около девяти тысяч лет назад.
+77
27 сентября 2009, 02:11
51

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

+2
Psixozzz #
Давайте уже к задачам перейдем, не терпится же))
+10
gvsmirnov #
Я ж не робот — строчить хабратопики непрерывно)
0
symbiosislab #
Спасибо Вам, очень интересная тема для меня, так как сам участвовал в региональной отборочной ACM в Саратове.
Не ожидал что второй топик вы напишите так быстро. Держите ваши заслуженные плюсы.
Также хотелось бы поподробнее узнать про TopCoder — что это такое и с чем его едят, упомяните про него в одной из следующих статей.
+2
IvanKotenko #
TopCoder пробовал. Напрягло только, что в переводе на московское время, турниры проходили где-то в 5 утра.
0
gvsmirnov #
Да, это неприятно, но не критично.
0
IvanKotenko #
Может стоит замутить подобный проект в нашем полушарии?
Нужно спонсора только найти. А трафик мы им обеспечим, первые места же занимаем:)
0
gvsmirnov #
Для этого нужно заручиться поддержкой Китайцев.
Но большого смысла делать «клона» нет: почти все крупные компании уже сотрудничают с TopCoder. Максимум, что можно устроить — это раскрутить Тимус на деньгоконтесты, только вот зачем?
0
zubrabubra #
1. не всегда в 5 утра, бывает и в 6 вечера, а бывает по выходным =)
2. учтите что помимо вас в топкодере есть ребята с диаметрально проположной точки, за счет иногда вам не удобно, иногда им не удобно и получается что все счастливы!

Дерзайте ТопКодер это захватывающее действо!
+2
daodizzy #
От себя могу добавить маленькую вещицу — для полного освоения пути джедая нужно ЕЩЕ и придумывать задачи самому (красивые задачи, требующие изящного решения, может даже под определенные языки). Это очень сильно поможет развиться всецело.
+8
MikeMirzayanov #
Вообще говоря, если универ уже за плечами, или Вы учитесь в чём-нибудь крупном (вроде СПБГУ ИТМО, СПБГУ, Саратовского ГУ, Киевского ГУ, Уральского ГУ, и так далее)… А если же вы учитесь в вузе, который хорошо себя проявлял ранее, то вас без малейшего зазрения совести отфутболят. А если и не отфутболят — то как у новичка у вас всё равно нет шансов против профи.


Вы слишком обобщаете, не имея никакой достоверной информации. Никогда в Саратовском ГУ никого, кто хотел бы заниматься не «футболили». Ежегодно у нас собирается группа новичков (и нет никакого ограничения на курс и специальность) из тех ребят, кто не занимался спортивным программированием в школе до университета. Им читается курс по структурам данных и алгоритмам, даются хорошие домашние задания. Через год они подтягиваются к основному потоку.

Не буду голословным: этот путь проделали многие наши участники (повторюсь, будучи школьниками они не занимались соревнованиями). Среди них есть золотые медалисты чемпионата мира по программированию, участники онсайтов и финалов Code Google Jam, обладатели дипломов первой степени полуфинала чемпионата мира.

Пожалуйста, поправьте текст так, чтобы он соответствовал действительности, а не получался экстраполяцией из двух-трех фактов. Я не думаю, что вы знаете в деталях, как учатся студенты «Киевского ГУ, Уральского ГУ, и так далее» и как работают с ними преподаватели.
0
MiXei4 #
Так только ИТМО наверное поступает, потому что они изначально набирают себе студентов-победителей школьных олимпиад со всей страны :)
А у остальных выбор не такой большой, чтоб отфутболивать желающих…
0
gvsmirnov #
Да-да, именно. У нас и так в этом году семнадцать команд на тренировках. x_x
0
Joshik #
На самом деле никто там и в ИТМО не поступает. Многие из знаменитых чемпионов мира из ИТМО до университета почти не занимались олимпиадным программированием и только в университете начали раскрываться.
0
Joshik #
тьфу, там -> так
0
gvsmirnov #
Да ну? Например?
0
Joshik #
Из последних чемпионов — Капун до университета не особо занимался (я учился с ним в одной школе).
Из предыдущих, насколько знаю, почти все :)
+1
zubrabubra #
еще бы МГУ в список добавить, а то как то не красиво получается =)
–1
gvsmirnov #
Они только один раз вошли в top5, а остальное время где-то далеко болтались.
–1
Lark #
Ну это ты конечно глупость сказал.
0
gvsmirnov #
Ну хорошо. Дважды второе место, один раз — пятое, но остальное время — далеко.
cm.baylor.edu/ICPCWiki/Wiki.jsp?page=Champions
+1
Lark #
Ну вот видишь так уже правильнее.
0
icekeeper #
Да, было бы интересно посмотреть на задачи. Профессионально участвовать в контестах лень (20-30 часов в неделю жалко), но иногда интересно решать красивые задачки.
0
danteus #
Посмотрите Юву, задачи от простых до задач с финалов ЧМ.
0
icekeeper #
Я в свое время много разных задач решал, и с Тимуса, и с других источников, и в топкодере участвовал. Сейчас меня практическое решение задач интересует мало, меня больше интересует теоретическое :) То есть если бы автор топика нашел сам сложную и красивую (не условием, а идеей решения) задачу — то мне было бы интересно почитать разбор, не более того. Но спасибо за ссылку.
0
gvsmirnov #
Будут, будут:)
0
zubrabubra #
ТопКодер ваш выбор! =)
все что от вас надо желание делать!
совет одного старого приятеля: 1. сперва решать задачки из архива SRM-ов, 2. потом перейти к лив контестам, к этому времени у вас сформируется представление о задачах.

К сожалению, большая часть задач топ кодера лежит в окрестностях некоторого множества базовых задач, так например, комбинаторика, сложный парсинг-преобразование строк, но задачи гробовые тоже бывают.

ТопКодер контест = 75 минут + результаты через минут 30-40 может часа 2.
0
icekeeper #
Я участвовал в топкодере раньше, правда забросил. Рейтинг там у меня пока синий… Так что представление о том что это и как я имею более чем хорошее. Дошел там в школьной лиге до этапа, на котором должны были раздавать футболки, но мне почему-то так и не прислали. Пожалуй, стоит к нему вернуться, эти соревнования лично для меня интереснее, чем ACM. Время только надо найти на все :)
+1
danteus #
странно, что вспомнили Тимус с «очень большой базой» в 700 задач, а про Юву забыли.
Напоминаю :)
uva.onlinejudge.org/, в придачу к действительно большой базе еще и регулярно проводятся контесты.

Кстати, а что случилось с ТТВ — белорусским аналогом топкодера?
–1
gvsmirnov #
… и UVa

Не забыл, просто не везде написал.
0
bashor #
реально, кто нить знает про ТТВ??? отличный был ресурс, не успел полностью наслодиться им:(
0
adrianopol #
На spoj.pl можно на многих языках сдавать (в т.ч. асм и brainf**k) ;-)
0
Assuri #
Спасибо за статью. Как Вы думаете, для успеха на олимпиадах обязательно иметь незаурядное мышление и аналитический ум или постоянными тренировками можно скомпенсировать отсутствие этого?
+1
icekeeper #
Постоянные тренировки и развивают незаурядное мышление и аналитический ум. Правда, только в том случае, если это не тренировки на отработку написания стандартных алгоритмов.
+3
hellt #
на Эйлере тоже можно потренироваться в алгоритмике и посмотреть варианты решения на множестве языков.

Был еще ознакомительный топик
0
zubrabubra #
«Путь олимпиадника» начните его со школьной скамьи, а не с института — в стародавние времена люди, поступая в институт, уже 2-3 жды были придерами россии.
0
icekeeper #
А если человек уже в институте, а хочет сейчас начать путь олимпиадника? Кстати, те самые стародавние времена никуда не делись. Школьные олимпиады никто не отменял. Правда, из года в год они претерпевают существенные изменения, меняется структура уровней олимпиад, меняются правила, меняется тематика, направленность и сложность задач. Но ведь так и должно быть :)
0
zubrabubra #
я только за! просто нужно рассказать об истории — как было в 90-е, как изменилось сейчас — насколько я понимаю система стала намного сложнее, ведь раньше просто тестировали и давали очки за задачу. были сложные тесты и простые тесты. было 5 или 6 задач и два дня =)
0
icekeeper #
Это, наверное, тема для отдельного топика :) В основном ведь школьники участвуют в олимпиадах 2-4 года, гораздо реже 5-7 лет. Поэтому рассказать об изменениях с позиции школьника сложно, это может сделать только тот, кто занимается организацией олимпиад. Я, к сожалению, к организации никогда причастен не был. На хабре уже появлялись статьи об организации олимпиад от студентов НГУ, вроде бы. Статью про историю олимпиадного движения по информатике я бы и сам с удовольствием почитал. )
0
gvsmirnov #
Казалось бы, основная хабрааудитория — старше, чем школьники.
0
za4to #
Совсем не обязательно. Я вполне успешно играл в ACM ICPC, при том что олимпиадами начал заниматься только в универе.
0
Sammarize #
Лично знаком с командой, которая абсолютно не занималась спортивным программированием в школе, а на третьем курсе уже была серебрянным призёром финала.
0
Bingo87 #
а ещё помимо ACM и CodeJam есть ImagineCup, где российские студенты тоже часто занимают призовые места. но там предпочтение отдается не алгоритмам, законченным проектам. и там путь уже совсем другой, надо уметь не только хорошо накодить, но и красиво представить своё творение.
0
gvsmirnov #
Знаем. Мне он совсем не нравится именно из-за того, что 90% оценки — то, как представлено.
0
iPavel #
Для школьников, учащихся в СПб, могу посоветовать пойти в Городской Дворец Творчества Юных. (обучение бесплатное (!!!!)) Там в отделе техники проводились занятия по разбору и тренировкам в формате ACM, после чего нас направляли на командную олимпиаду по городу и потом на Россию. Впечатления неописуемые.
–3
paxter #
Вообще по статистике многих олимпиадников не берут на работу…
+6
winger #
Интересно, откуда у вас такая статистика?
0
zubrabubra #
Можно бесконечно спорить, но будут всегда две стороны медали.

Интересно услышать Ваши аргументы, пожалуйста озвучьте. Я не хочу с Вами спорить, и надеюсь никто не будет, а олимпиадники на ус будут мотать — социализироваться и проч.
0
iPavel #
Хм… я могу провести аналогию. это как экстремальный разгон с жидким азотом против обычных систем охлаждения. В олимпиадном программировании важно, чтобы программа работала шустро при определенных тестах, рамки которых заданы. А в промышленном программировании нужна стабильность, защиты от дурака, документации и т.д. Люди поднатаскиваются под немножко разные вещи. Хотя, безусловно, олимпиадники умеют отлично программировать и мыслить, я это не оспариваю и текст выше — лишь моё ИМХО.
0
zubrabubra #
Про рамки кстати довольно забавно — 1-2 секунды, и не более 64Mb было когда-то, а так вы правы задачи промышленного программирования не ставятся — не надо валидировать данные(кстати диким ужасом бывает иногда узнавать о том что на некоторых олимпиадах заставляют данные валидировать), и нужно написать алгоритм решения задачи, который будет проходить на известном только проверяющей системе наборе тестов.

А мыслить умеют отлично вообще все =) просто у каждого своя специфика:
"… пусть каждый занимается своим делом..." (с) не помню откуда и возможно даже не правильно сцитировал.
+1
KLUBS #
у них разные роли. олимпиадники становятся профессиональными программистами для космоса, медицины, криптографии и пр. (те же драйвера) где очень важна скорость и память. Прикладным же действительно важна стабильность и защита от «прямых» рук пользователей. Каждый выбирает свой путь
–2
paxter #
Олимпиадники вообще слабо представляют, кто такой пользователь и что он может предоставить им заведомо неверные данные после чего их программа перестаёт работать и становиться неюзабельной для конечного пользователя.
+2
gvsmirnov #
Вот не нужно так обобщать.
С таким же успехом можно сказать, что все не-олимпиадники пишут говнокод, который работает на порядок, а то и на два дольше. Но я же такого не говорю.
0
gvsmirnov #
Опасносте. Пойду расскажу своему начальству, и начальству всех знакомых олимпиадников :)
0
Sammarize #
На работу не берут тех олимпмиадников, которым кажется, что олимпиадных навыков и знаних вполне хватит для промышленного программирования. А при прочих равных опыт в спотривном программирование является сильным бонусом во многих местах. Мне сейчас, например, сильно помогает то, что я пишу практически без ошибок, а баги (не только свои) могу искать без тестинга — просто внимательным чтением кода. Что очень приятно, особенно когда тестинг невозможен или затруднён =)
Ну и вообще, олимпиды дают много полезных навыков. Просто не надо забывать, что для работы нужны ещё кое-какие навыки, которых олимпиады не дают.
0
redchrom #
Интересно каково олимпиадникам попадать в реальный мир софтварной индустрии, где всё гораздо более скучно и уныло :(
+1
zubrabubra #
судя по себе — можно всегда найти места — почти в каждом проекте нужно будет решить какую нибудь хитрую задачу =) прооптимизировать используя алгоритмы что-нибудь например
0
gvsmirnov #
Есть и не-унылые места)
Любой, наверняка, слышал о Google. Например.
0
redchrom #
Всё-таки надо признать, что и львиная доля работы это собирание кирпичиков и ковыряние в технологиях. В том же гугле могут посадить писать тесты. Хорошие места работы действительно есть, но до них ещё нужно добраться либо создать самим :) Ну это я так, ворчу.
0
wersoo #
Прекрасно попадают, и гораздо быстрее и проще чем не олимпиадники.
+3
JIuxo #
Ну я бывший школьный олимпиадник, причем в терминальной стадии. Локальный, если хотите, экстремум. Попав в универ, первые пару лет жутко боялся пойти искать работу. Потом работа сама нашла меня, как олимпиадника. На месте, я совершенно не врубался в местную специфику (сроки, заказчики, коллеги, начальство). Меня бесили все остальные программисты, которые явно знали поменьше, в задачи глядели не так глубоко, к красивым результатам не стремились, зато делали все без лишнего напряга и в срок.
Закончилось все это для меня лично крушением, лобовым столкновением с жизнью. Не вписался. Однако все еще здесь, стараюсь приспособиться. Обращаюсь, вот, к людям.
Есть и много хорошего в олимпиадах. Но надо быть поосторожнее. Жизнь дает в точности то, к чему стремишься.
0
Xalegi #
завлекло… эххх

пойти чтоль в свой инст на третью вышку, тем самым получив пропуск в этот увлекательный мир спорт-программинга? :)
0
za4to #
Если только ради олимпиад, то особого смысла нет. Из-за ограничений по возрасту вы уже не сможете участвовать в ACM ICPC. А в остальных олимпиадах можно участвовать и не будучи студентом: TopCoder, Google Code Jam, онлайн-контесты на различных сайтах.
0
MaxSergeev #
В условии пишут ограничения по времени типа «Time Limit: 1.0 second»… а как определяется мощность процессора?

Или есть какие-то утвержденные конфигурации?
Или как-то теоретически рассчитывают?
0
za4to #
Обычно указывается конфигурация проверяющих машин.
+1
gvsmirnov #
Железо, которое стоит на проверяющем серваке, всегда известно участникам. А вообще, всегда можно исходить из рассчёта, что на 108 операций как раз хватит секунды.
0
za4to #
Кстати, если кто-нибудь сильно заинтересовался олимпиадами и хочет попробовать, как раз сегодня будет контест на UVa: Waterloo ACM Programming Contest Fall 1. Начало в 21:00 МСК.

Ещё можно добавить ссылки на сайты с расписаниями контестов:
snarknews.info/
algorithmist.com/index.php/Programming_Contest_Calendar
0
redchrom #
Народ после участия в ICFPC любит писать подробные отчёты о том как это было. Может и вы опишите, чтобы так сказать, можно было ощутить дух соревнования :)
0
gvsmirnov #
Если и напишу, то не скоро)
+3
icekeeper #
Существует такая расхожая точка зрения почему-то, что олимпиадники ничем не лучше людей, которые олимпиадами не занимались. Споры не утихают… Но лично по своему опыту могу сказать, что занятие олимпиадами как минимум не вредит навыкам промышленного программирования. Это разные вещи, настолько разные, что нельзя устанавливать взаимно однозначное соответствие. Если смотреть с точки зрения промышленного программиста — то олимпиады это всего лишь тренировка ума. Именно ума, а не только навыков сверхбыстрого кодинга. Любой олимпиадник, который кодит задачи с невероятной скоростью, в условиях неограниченного времени способен вдумчиво и красиво писать любой другой код. Это уже зависит исключительно от того, какой опыт промышленного программирования имеет человек, олимпиады на это не влияют. А вот скорость мышления, умение учиться, разбираться в алгоритмах, языках, умение решать некоторые возникающие во время решения производственной задачи проблемы — все это у человека занимающегося олимпиадами будет как минимум на хорошем уровне. Если понадобится что-то где-то оптимизировать алгоритмически, то такой человек сможет найти способ это сделать хорошо. Не стоит конечно впадать в крайности, занимаясь исключительно олимпиадами, для работы нужны совсем другие навыки. Но и преуменьшать значение олимпиад не стоит.
0
wersoo #
я учусь в Саратовском ГУ. Проходил как-то у нас topcoder contest, конечно на фоне наших золотоносцев вообще не заметно, зато теперь по дому в футболке с [] хожу ))
0
WingedFlame #
Вот, интересная мне тема) Плюс) Я, правда, школьник пока, но в том году был призером всероссийской олимпиады) Так что буду ждать и дальше на эту тему статей :)
0
cronoc #
Как-то оно всё-таки не логично))… Нигде не засветился человек, пришёл в университет — и тут то его и заразили программированием, и олимпиады попёрли? ИМХО так почти не бывает)…

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