Jak być dobrym w olimpiadach informatycznych?

0

Dobry wieczór.
Uważam, że znam się na amatorskim programowaniu, ponieważ stworzyłem już wiele programów typu: proste gierki 3d oparta na własnym silniku w opengl w c++, serwer http oparty na własnym silniku zajmującym się m. in. zarządzaniem wątków, aplikacje okienkowe typu client czatu, lecz mam ogromny problem z zadaniami na napisanie algorytmu pod daną treść, takimi jakie są na olimpiadach informatycznych. Czy żeby rozwiązywać takie zadania, trzeba być jakoś specjalnie przeszkolonym? Czy te zadania są "typowe" i, tak jak na maturze, trzeba nauczyć się po prostu jak rozwiązywać dany typ zadania? Czy te olimpiady informatyczne w ogóle mają coś wspólnego z prawdziwą pracą programisty?

0

Czy te olimpiady informatyczne w ogóle mają coś wspólnego z prawdziwą pracą programisty?

W 99%+ przypadków nie.

Czy żeby rozwiązywać takie zadania, trzeba być jakoś specjalnie przeszkolonym? Czy te zadania są "typowe" i, tak jak na maturze, trzeba nauczyć się po prostu jak rozwiązywać dany typ zadania?

Trzeba rozwiązywać zadania specjalnie pod olimpiady, w szczególności zadania z poprzednich olimpiad. Ewentualnie, na początku, szukać dobrych opracowań zadań.

1

Musisz przede wszystkim się temu poświęcić. Bez reszty.

Tak, jak napisał @Wibowit na początku czytaj opracowania i implementuj cudze pomysły. Ale z pełnym zrozumieniem! Bo zrozumienie wszystkiego jest kluczowe. Można trochę stereotypowo powiedzieć, że programista nie musi wiedzieć dlaczego coś działa. Inaczej ma się sprawa w przypadku algorytmika. On musi bardzo dokładnie rozumieć wszystko, co robi. Dlatego nie możesz pomijać dowodów czytając o czymś.

Poza tym, powinieneś wiedzieć, że może brakować Ci podstaw matematycznych. Zatem musisz sięgnąć po dobre książki królowej nauk i rozwijać się też w tym kierunku.

No i oczywiście dużo ćwiczyć. Bardzo dużo. Nie ma zadań takich samych, ale bywają podobne czy uzupełniające się. Musisz wyćwiczyć wiele różnych podejść i zrozumieć wiele różnych rozwiązań.
Przydatne będzie też zapoznanie się z jakąś podstawową literaturą. Nie będę się tu rozwodził na konkretnymi tytułami, bo chyba jest to teraz drugorzędne. Istotne jest to, że przed Tobą wiele tysięcy stron do przerobienia i setki zagadnień do poznania. Pomocne mogą się okazać różne strony internetowe, nagrane wykłady np. MIMUW czy inne materiały uczelniane.

Jak już osiągniesz pewien poziom to warto startować po prostu w różnych konkursach algorytmicznych. Potem czytać omówienia zadań i poznawać inne podejścia do jednego problemu. Wszystko się może kiedyś przydać.

Ubolewam, ale wcale nie musisz znać języka, w którym piszesz. Wiele osób zna tylko podstawy i to w zupełności wystarcza. Ale Ty znasz swój język dobrze? Wykorzystaj to! Doskonała znajomość języka i kompilatora / interpretera, w którym pracujesz daje Ci przewagę nad tymi, którzy są daleko w tyle za Tobą. Możesz pisać szybciej, sprawniej i bez błędów. Kod będzie się lepiej optymalizował i będzie wydajniejszy. Nie pokonają Ciebie też różne, nie dla wszystkich proste problemy (jak alokacja pamięci - serio). Bardzo dużo problemów na olimpiadach wynika z dziwnych błędów. Debugowanie nie polega na włączeniu debugra tylko wypisywaniu printfem jakiś wartości. A potem ktoś jeszcze zapomni to skasować i straci punkty przez wypisywanie diagnostycznych komunikatów. Musisz jednak porzucić niektóre dobre przy dużych projektach nawyki. Tutaj kod ma być bezbłędny i szybki. Nic innego się nie liczy. Napiszesz coś czytelnie? Dobrze, tak trzymaj. Napiszesz coś, czego się nie da przeczytać? Działa? No to gdzie leży problem? Czasem wyjdzie Ci jakaś funkcja, 50 linijek i nie do przeczytania. Nie działa, a powinna? Nie analizujesz jej - piszesz od nowa. Są też tacy, co piszą na tyle pewnie już swoje kody, że jak nie działa to zmieniają algorytm. To jest zupełnie inny styl pisania.

No i jeszcze jedno. Trzeba to czuć. Niestety. Ja nie będę muzykiem, bo nie mam słuchu, ktoś inny nic nie osiągnie na olimpiadzie bo nie ma predyspozycji. Smutna prawda. O tyle, o ile programowania może nauczyć się każdy to nie każdy upora się z algorytmiką i matematyką na poziomie olimpijskim.

Na koniec. Czy to ma coś z pisaniem komercyjnym?
Sam mam stosunkowo niewielkie doświadczenia (aby nie powiedzieć prawie żadne) w pisaniu w korpo. Ale jestem przekonany, że to zależy od tego czym się zajmujesz. Pewnie w większości przypadków jest tak, jak napisał @Wibowit. Ale jak zajmujesz się jakimś silnikiem czy czymś innym, co wymaga dużej mocy obliczeniowej, skomplikowanych struktur danych i nieznanych rozwiązań - Twoja wiedza jest niezastąpiona. Oczywiście, nie będziesz pisał tak, jak na olimpiadzie, ale samo myślenie, sposób rozwiązywania problemów, znajomość algorytmiki i wszystkie inne rzeczy, których się nauczysz przygotowując do olimpiady będą bezcenne.

PS
Pisząc ten post czułem się jakbym reklamował ponadczasową ścierę do garów za "7zł z VAT o ile zadzwonisz już teraz!" w telewizji. :D

0

W olimpiadach prawdziwe zadanie jest po prostu ukryte pod treścią. Chcesz zrobić grę, to siadasz i robisz, chodzenie strzałkami, strzelanie spacją, nie musisz się głowić "co autor miał na myśli". Grunt to się rozwijać, a konkursy.. po co to komu? Zadania są małorealistyczne, a na dodatek wykorzystują składnię języka do pętli while.

0

Bardzo dziękuje za odpowiedzi. Jakiś czas temu, gdy byłem jeszcze w gimnazjum, uczestniczyłem w takiej olimpiadzie. Udało mi się przejść tylko pierwszy etap, na drugim poległem całkowicie, co mnie mocno zdołowało. Teraz wiem, że była to wina nieodpowiedniego przygotowania, którego nie zapewnił mi ani nauczyciel, a nie ja sam, bo nie wiedziałem w co się pakuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1