Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Как развиваться в олимпиадном программировании? [закрыт]

#cpp #алгоритм #олимпиада


        
             
                
                    
                        
                            Closed. This question is opinion-based. It is not currently
accepting answers.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Want to improve this question? Update the question so
it can be answered with facts and citations by editing this post.
                        
                        Closed 1 месяц назад.
                                                                                
           
                
        
С недавнего времени меня очень зайтересовало олимпиадное программирование.  

Я учусь на первом курсе.
Основы языка и несложные алгоритмы я уже выучил.
Но вот как мне дальше развиваться не знаю.  

Что учить?
 Где учить?
Где можно поучаствовать?
 Какие-нибудь курсы?
 Какие-нибудь форумы? 



Буду очень признателен если кто-то поможет.
    


Ответы

Ответ 1



Выскажу своё мнение, так как много лет занимался олимпиадами и был участником чемпионата мира по программированию (19-е место). Сейчас я программист-математик в довольно узкой области, но владею этой областью как профессионала международного уровня. Не смог бы стать таким профессионалом если бы вовремя не соскочил с иглы олимпиад. Первое, что вы обязаны понимать: олимпиады - это игра. Она полезная, развивает некоторые полезные навыки программирования и немаловажную способность к оптимизации. Когда я закончил играть в эту игру лет 13 назад, я был удивлён тому, насколько лучше любых других программистов я умею писать быстрый и эффективный код, который они даже представить себе не могли (когда речь идёт о сложных задачах). Но главное в этой игре - ВОВРЕМЯ УЙТИ. В один прекрасный момент вы должны понять, что наступила точка насыщения, после которой вместо развития начинается деградация. Вы начинаете работать уже не на развития своих навыков, а на оттачивание до совершенства именно соревновательных навыков, которые на реальной работе не нужны и даже вредны. Второе: олимпиадники не способны решать задачи, на которые нужно потратить больше 5 часов времени. Сколько я не преподавал, ни разу не попался человек, успешный в олимпиадах, но при этом способный решать сложные научные задачи. Они привыкли, что можно написать некий просто хороший код, эффективнее которого не смогут написать почти 100% обычных программистов, и этого достаточно. Но нет, в научных расчётах попадаются такие задачи, которые нужно пробивать месяцами упорного труда типа "написал - стёр - написал заново", этот цикл может длиться десятки итераций и приходится применять те приёмы, которые НЕ нужны в олимпиадах. Они этого не умеют. И, что ужасно, не могут себя заставить переучиться с игры на кропотливый труд. Третье: олимпиадники не способны писать грамотный промышленный код. Их можно этому научить, но не всегда получается. Да, их код очень хорош в плане эффективности, они чувствуют код как свою часть тела и знают как он будет работать. Многие из них даже не делают ошибок в коде - он сразу запускается и работает правильно (так было у меня лет 13 назад, код на домашних тренировках я писал в "блокноте" (без плюсов) и он сразу компилировался и работал без ошибок, можно даже не проверять, но этот навык не нужен и быстро теряется). Но одна беда: этот код не понятен другим людям, он не структурирован так, чтобы в нём легко можно было разобраться, чтобы заменить одну часть кода другой, его ВООБЩЕ невозможно поддерживать, можно только удалить и написать заново. Четвёртое: из второго и третьего пунктов следует важная деталь - параллельно с олимпиадами нужно работать над реальными задачами, имеющими практический смысл. Это могут быть игры (обязательно по правилам разработки игр, а не самопал), могут быть научные расчёты (обязательно по правилам той научной лаборатории, где работаете), могут быть промышленные задачи (по ВСЕМ правилам промышленного кода и разработки программного обеспечения). Только так вы не станете развитым лишь на один бок и не будете мучиться в своей профессиональной карьере. Пятое. Не впадайте в демонизм и не пытайтесь унижать своих собратьев, не прошедших олимпиадную школу. Они никогда не напишут какой-нибудь алгоритм Форда-Фалкерсона так, чтобы он работал быстро и правильно, у них в голове нет 70-100 алгоритмов, которые вы можете быстро напечатать за несколько минут, они даже не слышали, что такое максимальный поток, а вы знаете 15 алгоритмов его поиска наизусть. Это приводит к ощущению какой-то возвышенности и важности. На самом деле вы должны понимать главное: в реальной жизни вы - бесполезный мусор, если не умеете решать реальные задачи. Держите этот момент в голове, если захотите кого-то унизить, кто не знает что такое динамическое программирование, например. Шестое. Развитие вас как олимпиадника должно быть постоянным, нельзя останавливаться. Обязательно посещайте сборы программистов-олимпиадников, таких сейчас много, и когда нет сборов, каждый день решайте задачи с разных серверов. В наше время были популярными acm.timus.ru и acm.sgu.ru, сейчас я даже не знают, работают ли они, но сейчас полно других вариантов: topcoder, codeforces (загуглите). Без сборов ваше обучения будет очень слабым. Без каждодневных тренировок на серверах (пусть хоть полчасика в день) - тоже. Седьмое. Как только поймёте, что дошли до точки насыщения и дальнейший рост в олимпиадах приводит только к развитию навыков скорости и соревнования, а классические основы всех алгоритмов вам уже известны, валите оттуда как можно скорее. Потому что с этого момента начинается ваша деградация как человека практического. Сразу переключайтесь на реальную работу, изучайте стандарты программирования, которые не смогли изучить в бытность олимпиадником и беритесь за реальные задачи. Если вы проигнорировали совет делать это параллельно, то придётся несколько лет переучиваться. Восьмое. Игры затягивают в себя своим соревновательным духом, олимпиады насыщают гордыню и подсаживают на чувстве значимости и особенности. Помните, что это иллюзия, увод в сторону. Это хорошая школа для того чтобы научиться чувствовать код и компьютер, изучить алгоритмы, но всё остальное (призы, места, победы и поражения, взгляды юных девушек) - это туфта. Не ведитесь на неё, потом будет обидно. Всё, желаю удачи, и да прибудет с вами здравый смысл :)

Ответ 2



Спортивная олимпиада поможет стать спортсменом. Математическая олимпиада поможет стать математиком. Олимпиадное программирование - не поможет стать программистом. Хобби - да. Как заменитель книг/игр - да. Как зарядка для ума - да. Как обучение программированию - нет. Слишком разные подходы к коду. Слишком разные цели у олимпиады и production. Поэтому, если хотите развиваться, советую участвовать в открытых проектах на github, gitlab, bitbucket, sourceforge и так далее. Таким образом вы и сообществу поможете, и получите опыт работы в команде, и получите опыт участия в реальных проектах. Да к тому же будет что показать работодателю если попросят примеры кода.

Ответ 3



Имхо Если Вы пишиете, и хотите продолжать писать на плюсах, то лучшее, что я могу Вам посоветовать, и что максимально поспособствует Вашему развитию (сугубо мое мнение), это написание игр. Начиная с легких консольных игр в которых будет присутствовать какая-то игровая логика, и двигаясь в сторону того, чтобы начинать изучать графические библиотеки, которые смогут помочь Вам постепенно лучше понять, как можно работать не только с консольными приложениями под винду, линукс и пр., а и приложения, на которые лично Вам станет приятнее смотреть. Как вариант, начните со змейки, крестиков ноликов, тенис и т.д. Лично я начинал с SFML, но вариантов также достаточно много, гугл поможет выбрать Ваш. В процессе, вероятнее всего, станет интереснее как написать более правильно, то что Вы делаете и тогда можно будет копнуть глубже в паттерны. Книг много и каждому больше подходит свое. Вместе с этим можно поднатаскать и навыки алгоритмов, но не стоит пытаться выучить каждый, т.к. профита от этого мало и большая часть либо выучится на практике, пока Вы будете искать хорошее решение своей проблемы, либо же вовсе Вам не понадобится, в силу того, что использовать приходится в большинстве случаев именно готовые решения. Главное - не стоит сильно закапываться в эти темы без практики, т.к. сырая теория в программировании дает невероятно маленький выхлоп, при этом без практики забывается все это очень быстро. Курсы Выбор на рынке крайне большой, но в целом, можете посмотреть бесплатные лекции на той же Курсере курс от Яндекса, есть чему научится. Полезным и интересным мне показался курс про многопоточность/сокеты на Степике, опять таки бесплатный и с достаточном хорошим уровнем задач где-то после 20-30% курса. Полезно Если Вы в универе на 1 курсе, то навык, который в какой-то степени уже можно начать развивать, и который будет крайне полезен для Вас, как для программиста всегда - чтение чужого кода. Элементарно можете начать с помощи одногруппникам с его лабой, которая почему-то не работает. Пытаясь понять его код (если он не будет у всех копипастой) Вы будете понемногу, но учится работать с чужим кодом. Т.к. в этой професии работать с чужим кодом зачастую приходится ооочень часто, то такой навык будет очень сильно упрощать Вашу первую и последущие. А еще, никогда не ленитесь дебажить, если что-то не работает, и сразу непонятно, что именно сломалось, в первую очередь попытайтесь изучить (если еще не изучили), а после применить свои скиллы дебагинга и найти корень зла в Вашей программе. П.С. Слегка сумбурно, скорее всего еще подкорректирую и дополню, но в целом, желаю успеха в Ваших начинаниях.

Ответ 4



Вопрос был задан про развитие в олимпиадном программировании, а ответы про то, насколько это бесполезно и т.д... Отвечу по теме. Во-первых надо смотреть по уровню. Лично я с командой в начале тренировался на этом сайте: https://acmp.ru/. Там много простых задач, и можно потихоньку увеличивать сложность. Некоторых задач можно найти разборы на ютубе и в интернете. Так же изучайте алгоритмы! На том же сайте есть тренировки алгоритмов, и хороший сайт с алгоритмами: http://e-maxx.ru/algo/. Там есть и графы, и со строками, и на комбинаторику, и всё, что душа пожелает. А участвовать можно на соревнованиях тут: https://codeforces.com/problemset . Тут самые похожие задачи с теми, что на олимпиаде. По началу можете в архивах находить те, что с самой простой сложностью. Когда повысите уровень, можете пробывать участвовать в соревнованиях. И вообще, олимпиадное программирование мало похоже на профессиональное, но оно даст вам хорошую базу, и знание алгоритмов. И когда мы ездим на олимпиады, всегда есть возможность завести новые знакомства, и куча it компаний предлагают работу у себя. Так что это точно опыт, который не помешает. Так что не слушай некого, и занимайся тем, что нравится))

Ответ 5



Мой любимий сайт с задачами по программированию, очень хорошо можно прокачать свой уровень и главное увидеть прогресс. Решая регулярно эти задачи можно подготовится к олимпиаде и не только, очень многое вам пригодится в учебе и в будущей работе. https://www.codewars.com/ Еще классний момент, сайт исходя из вашей инфы найдет других пользователей, которые учаться с вами в одном универе. Можно найти новых друзей. Удачи!

Комментариев нет:

Отправить комментарий