Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Мен Google HashCode World Championship Finals 2017 ойынына дайындалдым. Бұл Google ұйымдастырған алгоритмдік есептермен ең үлкен жарыс.

Мен тоғызыншы сыныпта C++ тілін нөлден бастадым. Мен бағдарламалау, алгоритмдер немесе деректер құрылымдары туралы ештеңе білмедім. Бір сәтте мен кодтың бірінші жолын жаздым. Жеті айдан кейін бағдарламалау бәсекесі көкжиекте көрінді. Мен бағдарламалауды үйрену стилі қаншалықты жақсы жұмыс істейтінін көргім келді. Бұл тамаша мүмкіндік болды.

Екі күнге созылған жарыстан кейін нәтиже шықты: мен алтын медаль алдым.

Мен таң қалдым. 5 жылдық тәжірибесі бар бәсекелестерден оздым. Мен көп жұмыс істегенімді білдім, бірақ бұл жетістік менің барлық үміттерімнен асып түсті. Мен спорттық бағдарламалау менің тақырыбым екенін түсіндім және онымен айналыстым.

Мен жетістікке не әкелгенін білемін және оны сіздермен бөліскім келеді.

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Мақала EDISON Software қолдауымен аударылған, ол бағдарламашылардың денсаулығына және олардың таңғы асына қамқорлық жасайды, және де арнайы бағдарламалық қамтамасыз етуді әзірлейді.

Қандай бағдарламалау тілін таңдау керек

  • C++ - Өте ұсынылады! Ол өте жылдам. STL арқасында алгоритмдерді енгізу аз уақытты алады. C++ барлық конкурстарда қабылданады. Мен кодтың бірінші жолын C++ тілінде жаздым.
  • C - STL арқасында C++ тілін үйреніңіз. Си тілін білсеңіз, C++ тілінде де бағдарламалауға болады.
  • Java - баяу бағдарламалау тілі. Оның Big Integer сыныбы бар, бірақ ол сізге көп көмектеспейді. Егер бәсекелестікте уақыт шегі болса, Java көмегімен сіз оны міндетті түрде асырасыз. Java барлық жарыстарда қабылданбайды.

Қай жерде жаттығуға болады

Мен ұсынамын Sphere Online Judge (SPOJ). Ол саны мен сапасы жағынан тиімді ресурс болып табылады. Мәселелерді шешу процесінде тұрып қалсаңыз, редакторлар мен шешімдер онлайн режимінде қолжетімді. Осы сайтқа қосымша мен ұсынамын SPOJ құралдар жинағы и SPOJ.pl үшін мәселе классификаторы.

Біріншіден, сіз негізгі білімдеріңізді шыңдауыңыз керек

Тілдің синтаксисіне үйренгеннен кейін кейбір қиындықтарды жеңу керек. Тәжірибені қажет ететін қарапайым есептерден бастаңыз. Бұл кезеңде ең бастысы - бағдарламалау стилін анықтау. Мүмкін сізге көп бос орын бар код жазу ұнайтын шығар, мүмкін емес. Сіз жақшаларды «егер» жолына қоюыңыз мүмкін немесе оларды бөлек жолдарға қоюыңыз мүмкін.

Сіз өзіңіздің бағдарламалау стиліңізді табуыңыз керек, өйткені бұл СІЗДІҢ стиль.

Оны іздеген кезде екі негізгі қағиданы есте сақтаңыз:

  • Сіздің кодыңызды орындау оңай болуы керек. Өзіңіз ойлап тапқан шешімді жүзеге асыруда өзіңізді жайлы сезінуіңіз керек. Неліктен? Өйткені жарыс кезінде сіздің кодыңызда жоғалып кетуді қалайтын соңғы нәрсе. Әрқашан оны анықтауға 5 минут жұмсағанша, кодты енгізуді қалай жеңілдету туралы ойлауға қосымша 10 минут жұмсаған дұрыс.
  • Сіздің кодыңыз оқуға оңай болуы керек. Кодты оқу оңай болса, оны түзету оңай. Келіңіздер, қателіктер әрқашан болады. Сіз бұл сезімді 10 минут қалдырған кезде білесіз бе, сіз қателікті таба алмайсыз ба? Әрине жасайсыз. Бұл жағдайды болдырмау үшін түсінікті кодты жазыңыз. Оны жөндеуді бастағаннан кейін код табиғи және түсінуге оңай болып көрінеді.

Міне, менің мысалым бағдарламалау стилі.

Даму дағдыларын қалай жақсартуға болады

Тәжірибе, тәжірибе және тағы басқа тәжірибе. Мен сізге ең шешілетін алғашқы 250 мәселені шешуді ұсынамын SPOJ. Оларды ретімен шешіңіз. Олардың әрқайсысының шешімі туралы ойлануға кем дегенде бір сағат жұмсаңыз.

«Бұл мәселе маған тым қиын, келесісін шешуге тырысамын» деп айтпаңыз. Жеңілгендер осылай ойлайды.

Қағаз мен қарындаш алыңыз. Ойлан. Мүмкін сіз шешім таба аласыз, мүмкін емес. Кем дегенде, сіз алгоритмдік ойлауды дамытасыз. Бір сағат ішінде шешім таба алмасаңыз, дайын шешімді форумда немесе мақалалардан іздеңіз.

Бұл тәсілмен сіз қандай нәтижеге жетесіз? Кодты пайдаланып идеяларыңызды жылдам жүзеге асыруды үйреніңіз. Және классикалық есептер мен алгоритмдерді зерттейді.

Екіншіден, алгоритмдер мен деректер құрылымдарын меңгеру керек

Иерархиялық тәсілді ұстаныңыз. Сіз қалай жүруді білмей жүгіре бастадыңыз ба? Жоқ. Мықты іргетассыз зәулім ғимарат тұрғыза аласыз ба? Қайтадан емес.

Оқу жолындағы қадамдарды елемеуге болмайды. Егер сіз оларды елемейтін болсаңыз, сізде білім олқылықтары қалады. Уақыт өте олар тек нашарлайды.

Негізгі алгоритмдер мен деректер құрылымдарынан бастаңыз

Бастау қиын. Мүмкін сіз алдымен нені оқу керектігін білмейсіз. Сондықтан «Алгоритмдер және деректер құрылымдары» бейне курсын жасадым.. Бұл курсты құру кезінде мен оны қалай оқытқым келетінін негізге алдым. Реакция керемет болды! Бірінші айда 3000-ден астам елден 100-нан астам студент курсқа жазылды.

Жеңіл мәселелерді шешуге тырыссаңыз, сіз ешқашан жақсармайсыз.

Сіз білмеген нәрсені түсінудің ең тиімді жолы - оны іс жүзінде сезіну. Мен осылай үйрендім. Күрделі тапсырманы таңдау арқылы бұрын естімеген көптеген жаңа әдістерді үйрендім.

Сіз жұмыс істейтін әрбір үшінші мәселе сізге жаңа нәрсені үйретуі керек. Мәселелерді таңдағанда абай болыңыз. Күрделі есептерді таңдаңыз!

SPOJ ұсынған осы 250 мәселені аяқтағаннан кейін сіз спорттық бағдарламалаудың негізгі тақырыптары туралы негізгі түсінікке ие боласыз. Негізгі алгоритмдердің логикасын терең түсіну арқылы жоғары деңгейлі алгоритмдер күрделірек болып көрінеді. Осылайша сіз өзіңіздің біліміңізді барынша пайдалана аласыз.

Негізгі тақырыптардың әрқайсысын тереңірек зерттеңіз

Міне, құнды ресурс көп ақпаратпен. Онда сіз әрбір тақырып үшін ең жақсы 10 алгоритм мен деректер құрылымын табасыз. SPOJ ұсынған 250 мәселеден кейін сіз осы тізімнен көп нәрсені білесіз. Бірақ сіз бұрын ешқашан естімеген көптеген нәрселерге де тап боласыз. Сондықтан осы тақырыптарды өсу ретімен оқуды бастаңыз.

Жаңа нәрсені үйренгеннен кейін біліміңді шыңдамасаң, бәрін тез ұмытасың.
Мен жаңа алгоритмді үйренгеннен кейін оны іс жүзінде қолдануды ұсынамын. 2-3 тапсырма арқылы жұмыс жасаңыз. SPOJ ішінен алгоритм тегін іздеңіз. Онда сіз осы алгоритмді шешуді қажет ететін мәселелерді таба аласыз. Алдымен осы мәселелерді шешіңіз.

Динамикалық бағдарламалауды меңгеріңіз, себебі ол сізді жеңіске жетелейді
Менің тәжірибем бойынша әрбір жарыста кем дегенде бір мәселе болады динамикалық бағдарламалау. Көптеген адамдар «динамикалық бағдарламалау» деген сөзді естігенде бас ауыртады, өйткені олар оны мүлдем түсінбейді.

Бұл да жақсы. Өйткені, егер сіз динамикалық бағдарламалауды түсінсеңіз, онда сіз жеңесіз.

Маған динамикалық бағдарламалау ұнайды, бұл менің сүйікті тақырыбым. Динамикалық бағдарламалаудың құпиясы тек жергілікті емес, ғаламдық оңтайлы таңдау жасауда. Мәселені қарапайым қосалқы мәселелерге бөлу керек. Осы ішкі есептердің әрқайсысын тек бір рет шешіңіз. Содан кейін шешілген ішкі мәселелерді біріктіретін шешім жасаңыз. Ашкөз алгоритм - динамикалық бағдарламалауға қарама-қарсы. Ол әр қадамда жергілікті оңтайлы таңдау жасауды талап етеді. Ал жергілікті оңтайлы таңдау нашар жаһандық шешімге әкелуі мүмкін.

Жаңа ұғымдарды үйреніп жатқанда, тексеріңіз TopCoder оқулықтары. Олар өте егжей-тегжейлі және түсінікті. Солардың арқасында мен түсіндім екілік индекстелген ағаштар.

Көп жұмыс істе

Сіз көп жылдық жаттығусыз Олимпиадада жеңіске жеткен спортшылар туралы естідіңіз бе? Мен емес.

Жыл сайын компьютерлік олимпиадаға дайындық қыркүйек айында басталып, сәуір айында аяқталатын.

Осы 8 айда мен күн сайын 5 сағат жаттығатынмын.

Иә, мен бұл 5 сағатты тек алгоритмдік есептерді шешуге жұмсадым. 8, тіпті 10 сағат жаттыққан күндерім есімде. Неліктен? Өйткені маған ұнады. Күнде мектептен үйге оралған соң бірден жатын бөлмеге кіріп, компьютерге отырып, жаңа мәселені талдай бастадым. Немесе мен бұл мәселені шешу үшін білуім керек жаңа алгоритмді үйрендім.

Жеңгің келсе, сен де солай істеу керек. Мәселені таңдап, оны ұстаныңыз. Супермаркетке жаяу бара жатқанда немесе көлік жүргізу кезінде бұл туралы ойланыңыз.

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Сіз ұйықтап жатқанда миыңыз сол күні жиналған ақпаратты дефрагментациялайтынын білесіз бе? Ол кітаптарды сөреде алфавит ретімен жинап жатқан көрінеді. Негізінде, сіздің миыңыз сіз тап болған әртүрлі мәселелер туралы ойлайды.

Мұны шебер қолдануға болады. Ұйықтар алдында қиын мәселені оқып, оны шешу үшін не қажет екенін есте сақтаңыз. Бұл кезеңде шешімнің өзін іздеудің қажеті жоқ. Ұйықтауға жату. Сіздің миыңыз бұл мәселені өңдей бастайды. Сіз оянғанда, сіз ұйықтап жатқанда шешімді тапқаныңызды түсініп, таң қаласыз.

Өзіңіз көріңіз. Бұл сиқыр сияқты.

Мен бейне блог жасадым

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Бұл қысқа параграф спорттық бағдарламалауға қатысты емес. Егер сіз жиырма жаста болсаңыз және менің әлемді қалай көретінімді білгіңіз келсе, оны тексергіңіз келуі мүмкін Youtube-тегі менің бейне блогым. Мен ондағы әлем, өмір және информатика туралы айтамын.

Ақылды жұмыс

Бұл табыстың құпиясы. Сізге мақсаттар керек.

Біз адамдармыз және бізге ұнайды кейінге қалдыру. Біз әрқашан дәл қазір істеу керек нәрсені кейінге қалдырғымыз келеді. Netflix-ті көру динамикалық бағдарламалау мәселелерін шешуден гөрі әрқашан жағымдырақ. Сіз мұны білесіз және оны түзетуіңіз керек.

Кейінге қалдыруды қалай жеңуге болады

Өзіңізге мақсаттар қойыңыз. Сіз әрқашан жаңа нәрсені үйренуге болатын қызықты мәселелерді таба аласыз (жоғарыда айтқан ресурстарды қараңыз). Бірақ бұл проблемаларды оқу ғана емес, шешу керек.

Міне, мен кейінге қалдыруды жеңдім. Мен қағаз күнтізбесін бастадым және әр күнімді шешкім келген мәселелермен толтырдым. Мен есептерді екі күн бұрын толтырдым. Сондықтан мен келесі күндері уақытымды қалай басқару керектігін білдім.

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым

Сондықтан мен әрқашан мотивация алдым. Маған кейбір мәселелерді шешіп, күнтізбедегі келесі күндерді толтыру үшін жаңаларын табу керек болды. Шешілген мәселелерді кесіп өту керемет сезім тудырады. Сізге де ұнайтынын білемін.

Өзіңіздің қағаз күнтізбеңізді алыңыз. Телефонда ертең ұмытып қалатын басқа істер тізімін жасамаңыз.

Қалай тиімді жөндеуге болады

Сіз кәсіпқой болғыңыз келе ме? Егер иә болса, онда сіз оны «ойыңызда түзету» керек.
Бұл мен білетін ең тиімді жөндеу әдісі, себебі ол мүлде отладчикті қажет етпейді. Сіздің миыңыз бірнеше код тармақтарын бір уақытта тексереді және кодқа қарағанда әлдеқайда кеңірек шолуды береді классикалық отладчик.

Сіз өзіңізді шахмат ойнайтын және 3 қадам алда ойлайтын гроссмейстермен салыстыруға болады.

Мен бұл әдісті өзімнің бастапқы қорғаныс сызығым ретінде ғана қолданамын. Содан кейін мен нақты отладчикті қолданамын.

Басыңызда жөндеуді үйрену үшін сізге жаттығу керек. Мәселе шешімін растағанда және «дұрыс емес жауап» алсаңыз, түзеткіш түймешігіне тікелей өтпеңіз. Кодты қайта оқып шығыңыз және ойланыңыз: «Бұл жолда не болып жатыр?», «Мұндағы «егер» бағдарламаға қалай әсер етеді?», «Циклдан шыққан кезде итератордың мәні қандай?»

Осылайша сіз өзіңіз туралы ойлайсыз. Уақыт өте келе сіз код жазуды және оны жылдам түзетуді үйренесіз.

Автор туралы

Есептеу олимпиадасында 3 алтынның 4-еуін қалай жеңіп алдым
Андрей Маргелою - кәсіпкерлікке, стартаптарға және ашық ауада қызығушылық танытатын бағдарламашы. Сіз онымен байланыса аласыз LinkedIn сайтында.

Аударма: Диана Шеремьева

Ақпарат көзі: www.habr.com

пікір қалдыру