Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Przygotowywałem się do Finałów Mistrzostw Świata Google HashCode 2017. To największy konkurs z problemami algorytmicznymi organizowany przez Google.

Zacząłem uczyć się C++ od zera w dziewiątej klasie. Nie wiedziałem nic o programowaniu, algorytmach i strukturach danych. W pewnym momencie napisałem pierwszą linijkę kodu. Siedem miesięcy później na horyzoncie pojawił się konkurs programistyczny. Chciałem sprawdzić, jak dobrze sprawdzi się mój styl nauki programowania. To była idealna okazja.

Po dwóch dniach rywalizacji przyszły wyniki: zdobyłem złoty medal.

Byłem zszokowany. Wyprzedziłem konkurencję 5-letnim doświadczeniem. Wiedziałem, że ciężko pracowałem, ale to osiągnięcie przeszło moje wszelkie oczekiwania. Zdałem sobie sprawę, że moim tematem są programy sportowe i rzuciłem się w to na żywioł.

Wiem, co doprowadziło mnie do sukcesu i chcę się tym z Tobą podzielić.

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Artykuł został przetłumaczony przy wsparciu firmy EDISON Software, która dba o zdrowie programistów i ich śniadaniea także tworzy oprogramowanie na zamówienie.

Jaki język programowania wybrać

  • C++ - Gorąco polecam! Jest bardzo szybki. Implementacja algorytmów zajmuje niewiele czasu dzięki STL. C++ jest akceptowany we wszystkich konkursach. Pierwszą linijkę kodu napisałem w C++.
  • C - Naucz się C++ dzięki STL. Jeśli znasz C, możesz także programować w C++.
  • Java jest powolnym językiem programowania. Ma klasę Big Integer, ale niewiele ci to pomoże. Jeśli konkurs ma limit czasowy, dzięki Javie z pewnością go przekroczysz. Java nie jest akceptowana na wszystkich zawodach.

Gdzie możesz ćwiczyć

polecam Sędzia Sfery Online (SPOJ). Jest to zasób efektywny pod względem ilościowym i jakościowym. Edytory i rozwiązania są dostępne online, jeśli utkniesz w procesie rozwiązywania problemów. Oprócz tej strony polecam Zestaw narzędzi SPOJ и klasyfikator problemów dla SPOJ.pl.

Najpierw musisz udoskonalić swoją wiedzę o podstawach

Kiedy już przyzwyczaisz się do składni języka, będziesz musiał pokonać pewne problemy. Zacznij od prostych problemów wymagających praktyki. Na tym etapie najważniejsze jest określenie swojego stylu programowania. Może lubisz pisać kod z dużą ilością białych znaków, a może nie. Możesz umieścić nawiasy w tym samym wierszu, co „jeśli”, lub możesz umieścić je w oddzielnych wierszach.

Musisz znaleźć swój styl programowania, ponieważ jest to TWOJ styl.

Szukając go pamiętaj o dwóch podstawowych zasadach:

  • Twój kod powinien być łatwy do wdrożenia. Powinieneś czuć się komfortowo wdrażając rozwiązanie, które wymyślisz. Dlaczego? Ponieważ podczas zawodów ostatnią rzeczą, której chcesz, jest zagubienie się w kodzie. Zawsze lepiej jest poświęcić dodatkowe 5 minut na myślenie o tym, jak uprościć implementację kodu, niż spędzić 10 minut na próbach jego rozwiązania.
  • Twój kod powinien być łatwy do odczytania. Gdy kod jest łatwy do odczytania, łatwo jest go debugować. Nie oszukujmy się – błędy zdarzają się cały czas. Znasz to uczucie, kiedy zostało Ci 10 minut i nie możesz znaleźć cholernego błędu? Oczywiście, że tak. Aby uniknąć takiej sytuacji, napisz czytelny kod. Gdy zaczniesz debugować, kod będzie wydawał się naturalny i łatwy do zrozumienia.

Oto mój przykład styl programowania.

Jak poprawić swoje umiejętności rozwojowe

Praktyka, praktyka i jeszcze raz praktyka. Zalecam przepracowanie pierwszych 250 problemów, które są najłatwiejsze do rozwiązania SPOJ. Rozwiąż je po kolei. Spędź co najmniej godzinę, zastanawiając się nad rozwiązaniem każdego z nich.

Nie mów: „Ten problem jest dla mnie za trudny, spróbuję rozwiązać następny”. Tak myślą przegrani.

Weź kartkę papieru i ołówek. Pomyśl o tym. Być może uda się znaleźć rozwiązanie, być może nie. Rozwiniesz przynajmniej myślenie algorytmiczne. Jeśli nie możesz znaleźć rozwiązania w ciągu godziny, poszukaj gotowego rozwiązania na forum lub w artykułach.

Co osiągniesz dzięki takiemu podejściu? Naucz się szybko wdrażać swoje pomysły za pomocą kodu. I studiuj klasyczne problemy i algorytmy.

Po drugie, musisz opanować algorytmy i struktury danych

Postępuj zgodnie z podejściem hierarchicznym. Zacząłeś biegać, nie wiedząc, jak chodzić? NIE. Czy można zbudować drapacz chmur bez solidnego fundamentu? Nie znowu.

Nie można ignorować kolejnych etapów ścieżki edukacyjnej. Jeśli je zignorujesz, pozostaną luki w wiedzy. Z biegiem czasu będą się tylko nasilać.

Zacznij od podstawowych algorytmów i struktur danych

Trudno jest zacząć. Być może dlatego, że nie wiesz, czego się uczyć najpierw. Dlatego Stworzyłem kurs wideo „Algorytmy i struktury danych”. Tworząc ten kurs, oparłem się na tym, jak sam chciałbym być nauczany. Reakcja była niesamowita! W pierwszym miesiącu na kurs zapisało się ponad 3000 studentów z ponad 100 krajów.

Jeśli będziesz pracować nad rozwiązywaniem łatwych problemów, nigdy się nie poprawisz.

Najskuteczniejszym sposobem zrozumienia tego, czego nie wiesz, jest doświadczenie tego w praktyce. Tak się nauczyłem. Wybierając wymagające zadanie, nauczyłem się wielu nowych technik, o których nigdy wcześniej nie słyszałem.

Co trzeci problem, nad którym pracujesz, powinien nauczyć Cię czegoś nowego. Bądź bardziej ostrożny przy wyborze problemów. Wybierz trudniejsze problemy!

Po rozwiązaniu tych 250 problemów ze SPOJ będziesz mieć podstawową wiedzę na temat podstawowych tematów programów sportowych. Dzięki głębokiemu zrozumieniu logiki stojącej za podstawowymi algorytmami algorytmy wysokiego poziomu będą wydawać się mniej złożone. W ten sposób możesz maksymalnie wykorzystać swoją wiedzę.

Zagłęb się w każdy z głównych tematów

Oto cenne źródło z dużą ilością informacji. Znajdziesz tam 10 najlepszych algorytmów i struktur danych dla każdego tematu. Po 250 problemach ze SPOJ dowiesz się wiele z tej listy. Ale natkniesz się także na wiele rzeczy, o których nigdy wcześniej nie słyszałeś. Zacznij więc studiować te tematy w kolejności rosnącej.

Jeśli nie ugruntujesz swojej wiedzy po nauczeniu się czegoś nowego, szybko o wszystkim zapomnisz.
Polecam po poznaniu nowego algorytmu zastosować go w praktyce. Wykonaj 2-3 zadania. Poszukaj tagu algorytmu w SPOJ. Znajdziesz tam problemy, które wymagają rozwiązania tego algorytmu. Najpierw zajmij się tymi kwestiami.

Opanuj programowanie dynamiczne, ponieważ poprowadzi Cię ono do zwycięstwa
Z mojego doświadczenia wynika, że ​​każda konkurencja ma przynajmniej jeden problem Programowanie dynamiczne. Wiele osób odczuwa ból głowy, gdy słyszy wyrażenie „programowanie dynamiczne”, ponieważ w ogóle go nie rozumie.

I to jest dobre. Bo jeśli zrozumiesz programowanie dynamiczne, to wygrasz.

Lubię programowanie dynamiczne, to mój ulubiony temat. Sekret programowania dynamicznego polega na dokonywaniu wyborów optymalnych globalnie, a nie tylko lokalnych. Musisz podzielić problem na prostsze podproblemy. Rozwiąż każdy z tych podproblemów tylko raz. Następnie utwórz rozwiązanie, które łączy w sobie rozwiązane podproblemy. Chciwy algorytm - przeciwieństwo programowania dynamicznego. Wymaga to dokonywania na każdym etapie lokalnie optymalnych wyborów. A lokalnie optymalny wybór może prowadzić do złego rozwiązania globalnego.

Ucząc się nowych koncepcji, sprawdź Poradniki TopCodera. Są bardzo szczegółowe i zrozumiałe. Dzięki nim udało mi się to zrozumieć drzewa indeksowane binarnie.

Pracuj ciężko

Czy słyszałeś kiedyś o sportowcach, którzy wygrywali igrzyska olimpijskie bez lat ćwiczeń? Ja nie.

Co roku przygotowania do Olimpiady Komputerowej rozpoczynały się we wrześniu, a kończyły w kwietniu.

Codziennie przez te 8 miesięcy ćwiczyłem po 5 godzin.

I tak, te 5 godzin spędziłem wyłącznie na rozwiązywaniu problemów algorytmicznych. Pamiętam czasy, kiedy ćwiczyłem po 8, a nawet 10 godzin. Dlaczego? Ponieważ mi się to podobało. Każdego dnia, kiedy wracałem ze szkoły do ​​domu, od razu szedłem do sypialni, siadałem przed komputerem i zaczynałem analizować nowy problem. Albo uczyłem się nowego algorytmu, który musiałem znać, aby rozwiązać ten problem.

Jeśli chcesz wygrać, musisz zrobić to samo. Wybierz problem i trzymaj się go. Pomyśl o tym idąc do supermarketu lub jadąc samochodem.

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Czy wiesz, że kiedy śpisz, Twój mózg defragmentuje informacje zebrane tego dnia? Wygląda, jakby układał książki na półce w kolejności alfabetycznej. Zasadniczo Twój mózg myśli o różnych problemach, przed którymi stoisz.

Można to umiejętnie wykorzystać. Przed pójściem spać przeczytaj trudny problem i pamiętaj, co jest potrzebne, aby go rozwiązać. Na tym etapie nie musisz szukać samego rozwiązania. Iść do łóżka. Twój mózg zacznie przetwarzać ten problem. Kiedy się obudzisz, będziesz zaskoczony, gdy zorientujesz się, że znalazłeś rozwiązanie podczas snu.

Spróbuj sam. To jak magia.

Stworzyłem wideobloga

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Ten krótki akapit nie dotyczy programów sportowych. Jeśli masz dwadzieścia kilka lat i zastanawiasz się, jak widzę świat, być może zechcesz to sprawdzić mój blog wideo na Youtube. Opowiadam o otaczającym go świecie, życiu i informatyce.

Pracuj mądrze

Oto sekret sukcesu. Potrzebujesz celów.

Jesteśmy ludźmi i lubimy to ociągać się. Zawsze chcemy odłożyć na później to, co należy zrobić teraz. Oglądanie Netflixa jest zawsze przyjemniejsze niż radzenie sobie z problemami z programowaniem dynamicznym. Wiesz o tym i musisz to naprawić.

Jak pokonać prokrastynację

Wyznaczaj sobie cele. Zawsze znajdziesz ciekawe problemy, z których możesz nauczyć się czegoś nowego (sprawdź zasoby, o których wspomniałem powyżej). Ale te problemy należy rozwiązać, a nie tylko o nich czytać.

Oto jak pokonałem prokrastynację. Zacząłem papierowy kalendarz i zapełniałem każdy dzień problemami, które chciałem rozwiązać. Zawsze wypełniałem problemy z dwudniowym wyprzedzeniem. Wiedziałem więc, jak zagospodarować czas w kolejnych dniach.

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej

Dlatego zawsze byłem zmotywowany. Musiałem rozwiązać pewne problemy i znaleźć nowe, aby wypełnić kolejne dni w kalendarzu. Wykreślanie rozwiązanych problemów jest świetne. Wiem, że ty też to lubisz.

Zdobądź swój własny papierowy kalendarz. Nie twórz w telefonie kolejnej listy rzeczy do zrobienia, o której jutro zapomnisz.

Jak skutecznie debugować

Chcesz zostać profesjonalistą? Jeśli tak, musisz „zdebugować to w swoim umyśle”.
Jest to zdecydowanie najbardziej wydajna technika debugowania, jaką znam, ponieważ w ogóle nie wymaga debugera. Twój mózg bada wiele gałęzi kodu jednocześnie i zapewnia znacznie szerszy przegląd kodu w porównaniu do innych klasyczny debuger.

Możesz porównać się do arcymistrza, który gra w szachy i myśli 3 ruchy do przodu.

Używam tej techniki wyłącznie jako mojej początkowej linii obrony. Następnie używam prawdziwego debuggera.

Aby nauczyć się debugować w głowie, musisz poćwiczyć. Kiedy sprawdzasz rozwiązanie problemu i otrzymujesz „złą odpowiedź”, nie przechodź od razu do przycisku debugera. Przeczytaj ponownie kod i pomyśl: „Co dzieje się w tej linii?”, „Jak to „if” wpływa na program?”, „Jaka jest wartość iteratora, kiedy wychodzimy z pętli?”

W ten sposób myślisz samodzielnie. Z biegiem czasu nauczysz się pisać kod i debugować go na bieżąco.

O autorze

Jak zdobyłem 3 z 4 złotych medali na Olimpiadzie Informatycznej
Andrei Margeloiu jest zapalonym programistą zainteresowanym przedsiębiorczością, start-upami i aktywnością na świeżym powietrzu. Możesz się z nim skontaktować na LinkedIn.

Tłumaczenie: Diana Szeremiewa

Źródło: www.habr.com

Dodaj komentarz