Język na OI

0

Jako, że na pewno wiele osób z tego portalu startowało w olimpiadzie informatycznej, to mam pytanie.
Uczę się od całkiem niedawna na poważnie do olimpiady, jestem w 2 liceum, więc to jest ostatnia szansa - dlatego intensywnie się uczę (lub przynajmniej się staram, gdy szkoła nie pozwala na niewiele poza nią).
Znam na razie tylko strukturalnie Pascala (na razie jeszcze bez implementacji dynamicznych struktur danych) i uczę się algorytmów (na razie podstawowe, będę przechodził do coraz trudniejszych).
Tutaj właśnie rodzi się pytanie, czy na OI bardziej przyda się jeżeli się nauczę C++ (oczywiście ciągle ucząc się algorytmów, poza tym znając programowanie strukturalne w pascalu to powinno mi łatwiej iść w C++), w którym można implementować biblioteki STL, czy czas ten lepiej poświęcić na naukę większej ilości algorytmów? Bo np. jeżeli mamy zadanie, to często bez znajomości odpowiednich algorytmów nie da się dojść do rozwiązania przynajmniej bliskiemu wzorcowi, na zadanie jest 2,5h, jeżeli umie się odpowiednie algorytmy i ćwiczyło się z niebieskich książeczek, to można o wiele więcej zdziałać niż z mniejszą znajomością algorytmów, a ze znajomością biblioteki STL (przynajmniej mi się tak wydaje).
Wiadomo - czas jest ważny (w 2 i 3 etapie), można by było implementować szybko struktury danych, ale czy nauka większej ilości algorytmów nie przyda się bardziej. Poza tym ile zajmuje implementacja bardziej zaawansowanych struktur danych (tj. graf, lista dwukierunkowa itp.) w pascalu zakładając ich dobrą znajomość ?
Chciałem sobie kupić książkę "Algorytmy + struktury danych = programy", gdzie są pokazane dokładnie programy z implementacjami algorytmów i struktur danych (oczywiście to jedna z wielu, które zamierzam kupić), ale jeżeli pisanie w Pascalu na OI to jest taką katorgą, to wtedy by się bardziej opłacało "Symfonię C++".
Zależy mi na odpowiedzi, ponieważ chcę wybrać najbardziej optymalne rozwiązanie, a nie mam dużo czasu (mam nadzieję uwinąć się z algorytmami do tej pory, jeszcze ponad pół roku, trochę już umiem, na wakacjach dużo czasu, a do tego na OI nie trzeba pamiętać wszystkich algorytmów jakie są w książkach, tylko te najmniejszą złożonością obliczeniową z każdej dziedziny).
Oczywiście C++ się nauczę (pewnie na najdłuższych wakacjach w życiu), ale na razie chcę się uczyć tak, żeby mieć jak największe szanse dostać się do finału OI.

0

Pascal jest zbyt wolny wg mnie. Weź Cormena (Tytuł: Wprowadzenie do algorytmów) do ręki i czytaj. Na początku się przerazisz, ale im wcześniej się za niego zabierzesz tym lepiej. Ja kupiłem Cormena chyba ze 2 - 3 miesiące przed OI i generalnie nie zdążyłem wtedy prawie niczego z niego zrozumieć. Poszukaj ewentualnie kogoś kto umie trochę algorytmów i niech ci pomoże z Cormenem.

Operacje na plikach/ konsoli/ etc olej całkowicie. Generalnie jedyne funkcje wbudowane z jakich będziesz korzystał na OI to printf/ scanf. Reszta to algorytmy i struktury danych. Dane są podawane na standardowe wejście, wypisywane na standardowe wyjście. Jeżeli program odpalisz za pomocą:
program < plik_wejściowy > plik_wyjściowy
to zawartość pliku plik_wejściowy zostanie wrzucona na standardowe wejście (tak jakbyć wpisywał ten plik ręcznie), a wyniki zostaną zapisane do pliku plik_wyjściowy z pominięciem wyświetlania na konsoli.

Algorytmy z najmniejszą złożonością są zwykle najtrudniejsze do zrozumienia, te wolniejsze można za to wymyślić na poczekaniu.

0

Pascal jest zbyt wolny wg mnie.

Jeżeli wolny w sensie działania programów, to wątpię, żeby to miało wpływ - liczy się prędkość wyrażona za pomocą notacji O.

Weź Cormena (Tytuł: Wprowadzenie do algorytmów) do ręki i czytaj. Na początku się przerazisz, ale im wcześniej się za niego zabierzesz tym lepiej. Ja kupiłem Cormena chyba ze 2 - 3 miesiące przed OI i generalnie nie zdążyłem wtedy prawie niczego z niego zrozumieć. Poszukaj ewentualnie kogoś kto umie trochę algorytmów i niech ci pomoże z Cormenem.

Oczywiście wiem o tym - mam ją wypożyczoną z biblioteki (mam pecha, bo książki tej nie ma w żadnej bibliotece tu gdzie mieszkam - jest tylko jedna biblioteka, która wypożycza z UMCSu lub KULu, ale tylko na pewien czas i przez to muszę co miesiąc nosić nosić w plecaku tą biblię i wypożyczać na nowo). Trochę już czytałem z matematyki głównie i nawet zrozumiałem o co chodzi (chociaż nie potrafiłbym np. dobrać odpowiednich stałych do notacji asymptotycznej). Na razie czytam głównie Algorytmy Sysło, która to książka zawiera opis podstawowych algorytmów, które często się również przydają. Ogólnie z literaturą nie ma problemów - dużo czytałem jakie książki są najlepsze. Na to, że mi ktoś pomoże również nie liczę - nie znam żadnego informatyka, nie licząc mojego nauczyciela, któremu się nawet nie chce kółka zrobić.

Algorytmy z najmniejszą złożonością są zwykle najtrudniejsze do zrozumienia, te wolniejsze można za to wymyślić na poczekaniu.

Ale jednak o tych ze większą można przeczytać, ale pamiętać dokładnie (wiadomo - algorytmy trzeba nie tylko zrozumieć, ale często wiele rzeczy również zapamiętać) i potrafić zaimpletować wg mnie tylko te z jak najniższą złożonością, ponieważ te kilka punktów na OI za efektywność może zaważyć o przejściu dalej.

W twoim poście nie ma dokładnej odpowiedzi na moje główne pytanie, czyli czy lepiej nauczyć się C++ z bibliotekami STL, czy większej ilości algorytmów i pisać w pascalu, ale z sensu twojej wypowiedzi wnioskuję iż ty postawiłbyś na to drugie rozwiązanie.

0

W C++ masz gotowe kolekcje, sporo prostych algorytmów, jeżeli umiesz to wykorzystać to jesteś ładne kilka minut do przodu w porównaniu do konkurencji klepiącej w Pascalu...

0

Moim zdaniem C++. Bo algorytm swoją drogą, ale jak sie nagle okaże że potrzebujesz jakąś głupią listę, mapę albo coś tego typu to w pascalu stracisz pół godziny na implementowanie struktur zamiast skorzystać z gotowych. Ale Symfonia ci się do tego nie przyda ;) Prędzej Cormen.
A programy na OI są puszczane na sprawdzarkę tak jak ta ze spoja i one liczą czas wykonania programu, ale limity są tak dobrane żeby algorytm o odpowiedniej złożoności przeszedl, a o wyzszej już nie.
Nikt tam nie liczy teoretycznej złożoności w notacji O, choćby dlatego że czasami trudno ją po prostu wyliczyć.

0

JumpSmerf:
Przecież jak korzystasz z STLa to nikt ci nie broni nauczyć się zasady działania tych struktur danych. Kopiec, drzewo czerwono-czarne, tablice asocjacyjne itd w ogóle struktury STLa to podstawy, nie wiem jak ty chcesz uczyć się czegoś skomplikowanego jeżeli nie wiesz co się kryje pod maską. Zresztą często będziesz musiał np wzbogacać jakieś struktury danych, np drzewa zrównoważone. Używanie STLa w takich przypadkach jest czasami niemożliwe albo nieefektywne. Np w drzewach czerwono-czarnych (chyba te są używane w STLu jako drzewa samo-równoważące się) w dowolnej operacji (np wstawianie, usuwanie) mamy stałą liczbę rotacji (tzn ograniczoną przez stałą). Można ten fakt wykorzystać do trzymania jakichś danych w węzłach trochę bardziej kosztownych do aktualizowania niż O(1).

0

Pascal jest zbyt wolny wg mnie.

Jeżeli wolny w sensie działania programów, to wątpię, żeby to miało wpływ - liczy się prędkość wyrażona za pomocą notacji O.

Jednak mierzony jest czas, a nie jakieś O. A źle wygenerowany kod wykonywalny może spowolnić program o rzędy wielkości.

Przykładowo, dość niewinny kod

struct Foo { };

struct Bar {
   virtual void func(Foo param) {};
};

int main() {
   Bar *bar = new Bar();
   Foo foo;
   for ( int i = 0 ; i < 100000000 ; i++ )
      bar->func(foo);
   delete bar;
}

kompilowany przez Visual C++ z parametrem /clr (czyli generowanie kodu dla .Net) działa u mnie około trzech minut, podczas gdy program natywny - pół sekundy.
Nie znaczy to, że .Net jest aż tak powolny - ot, błąd projektowy kompilatora. Który da się ominąć - jednak jeśli ktoś nie zna przyczyny problemu, może się naciąć.

Optymalizacje przeprowadzane przez kompilator (np. inline'owanie odpowiednich funkcji) lub ich brak mogą w pewnych sytuacjach mieć ogromny wpływ na czas działania programu - zwłaszcza w syntetycznych nieżyciowych testach, do których sprowadzają się wszelkie te olimpiady.
A kompilator Free Pascala, mimo że mam do niego duży sentyment, jest dość słaby w te klocki w porównaniu z tym, co potrafi GCC.

0

Chyba za bardzo się rozpisałem i nie zrozumieliście mnie dobrze. :/
A więc tak: znam (w większości) pascala, ale nie znam w ogóle C++.
Pytanie w takim razie:
Czy bardziej mi by się opłacało już tylko uczyć algorytmów i struktur danych (i na OI pisać w pascalu), czy uczyć się jeszcze do tego języka C++ (dzięki czemu mógłbym używać biblioteki STL, ale musiałbym się go nauczyć od podstaw, bo go nie umiem), ale w tej drugiej opcji musiałbym sporo czasu poświęcić na naukę C++, przez co umiałbym mniej algorytmów.

Poza tym wątpię, żeby język miał wpływ na limity - takowe są tak dobrane, że niezależnie od języka liczy się tylko wybrany algorytm (np. w niebieskich książeczkach jako programy wzorcowe są nie tylko te z C++, ale też te z Pascala - co już świadczy o tym, że liczy się algorytm).

Moim zdaniem C++. Bo algorytm swoją drogą, ale jak sie nagle okaże że potrzebujesz jakąś głupią listę, mapę albo coś tego typu to w pascalu stracisz pół godziny na implementowanie struktur zamiast skorzystać z gotowych. Ale Symfonia ci się do tego nie przyda Prędzej Cormen.

Właśnie o to mi chodzi, czy bardziej opłaca się nauczyć C++ (którego nie umiem) i oprócz tego uczyć się algorytmów i struktur danych, czy cały czas uczyć się tylko algorytmów i struktur danych i implementować je w Pascalu. Tutaj właśnie piszesz, że się oszczędza sporo czasu i właśnie czy jeżeli będę lepiej umiał algorytmy i struktury danych (i potrafił je całkiem szybko implementować), to czy straciłbym tak dużo czasu - tyle, że tak jak pisałem wcześniej bez nauki C++ poświęcę więcej czasu na algorytmy i struktury danych, a jeżeli trafiłby się taki, którego jeszcze nie przerobiłem to na pewno opcja z Pascalem o wiele bardziej się sprawdzi niż ta w C++.

Chodzi mi o to, kiedy będę miał większe szanse czy:

  • przy znajomości pascala (przy czym nauczyłbym się też całkiem szybko implementować struktury danych) i większej znajomości algorytmów i struktur danych;
  • przy znajomości C++ (którego obecnie nie umiem i na pewno sporo czasu by mi zajęła nauka go od podstaw), lecz nieco mniejszej algorytmów (bo część czasu musiałbym przeznaczyć na naukę języka).
    Którą opcję byście wybrali na moim miejscu?
    Na razie myślę bardziej o pierwszej opcji (mogę się nauczyć całkiem szybko i sprawnie implementować struktury danych, a algorytmy to najczęściej klucz do sukcesu, dodatkowo czytając niebieskie książeczki można nauczyć się uwijać z tymi programami szybciej niż jest w czasie), ale nie jestem pewien, bo czytałem opinie, iż pisanie w pascalu to masochizm i bardzo zły wybór, ale na pewno było dużo osób (szczególnie kiedyś), co korzystały z pascala na olimpiadzie - w końcu gdyby nikt z niego nie korzystał kto przechodzi dalej, to nie byłoby go już do wyboru jako jeden z języków na OI.

Mam nadzieję, że teraz rozumiecie o co się pytam. ;)

0

@JumpSmerf my cały czas rozumiemy o co pytasz. To ty nie rozumiesz odpowiedzi.
Nauczenie się C++ na poziomie potrzebnym do pisania algorytmów, jeśli umiesz już Pascala, to jest kwestia kilku dni. Razem z opanowaniem korzystania ze struktur danych to jest może z tydzień. No ale jeśli uważasz że wolisz pisać struktury sam w pascalu to zrób sobie mały test. Przypuśćmy że potrzebujesz w swoim rozwiązaniu drzewko czerwono-czarne. Spróbuj je sobie napisać samodzielnie, a następnie pomyśl że w C++ to by było mniej więcej

map<cośtam> treeMap;

Albo że potrzebujesz wyciągnąć z tablicy k-ty w kolejności element (ale tylko jeden, więc sortowanie się nie opłaca). W Pascalu będziesz się głowił jak tu wykorzystać magiczne piątki i szukanie mediany (jako ćwiczenie polecam sprawdzić ile czasu ci to zajmie), a w C++ napiszesz

nth_element (tablica,tablica+k,tablica+n);

I voila, mamy element k-ty na odpowiedniej pozycji.

0

@JumpSmerf my cały czas rozumiemy o co pytasz. To ty nie rozumiesz odpowiedzi.
Nauczenie się C++ na poziomie potrzebnym do pisania algorytmów, jeśli umiesz już Pascala, to jest kwestia kilku dni. Razem z opanowaniem korzystania ze struktur danych to jest może z tydzień. No ale jeśli uważasz że wolisz pisać struktury sam w pascalu to zrób sobie mały test.

Jeśli tak, naprawdę to kwestia kilku dni, to spoko - wtedy nie ma problemu.
Tylko właśnie czy wystarczy do nauki np. kurs ze strony main.edu.pl?
Później bym kupił Symfonię (lub wypożyczył z biblioteki, niestety na razie wiem, że mój znajomy z klasy ją posiada) i tylko bym sobie ją uzupełnił wiedzę (w końcu na main'ie jest wszystko co potrzebne do algorytmów), a jeśli ktoś myśli czemu się pascala uczyłem, zamiast C++ (niektórzy tak mogą myśleć patrząc na opinię na temat tego archaicznego języka), to pascal się na pewno przydaje do czytania książek algorytmicznych, gdzie pseudokod jest najczęściej wręcz bliźniaczo podobny do pascala).

0

@up no fakt, bo do zapamiętania w pseudokodzie (pseudopascalowym), że przypisanie to := a porównanie =, trzeba uczyć się całego języka :]

0

Zwykle najłatwiej o porządną implementację w C dowolnego algorytmu. W Pascalu raczej trudno. Chyba już łatwiej w Javie czy C#. Rozkminianie gotowego kodu w C jest jednym z dobrych sposobów na naukę.

Do korzystania z STLa tak naprawdę to znajomość C++ nie jest potrzebna. Wg mnie wystarczy znajomość C + przerobienie kilku tutoriali z neta jak wykorzystywać STL. A nauka C po nauce Pascala powinna być prosta.

Mało kto też zna C++ na wysokim poziomie. Większość programistów C++ tak naprawdę nie zna mniej intuicyjnych konstrukcji w tym języku. Przejrzyj sobie posty użytkowników deus czy quetzalcoatl, ich wywody nt C++ zaginają (czasoprzestrzeń).

Na OI, przynajmniej ZTCP, nikt nie wymaga pisania obiektowego kodu, stosowania wzorców projektowych, ani nie narzuca stylu. Twój program ma tylko wczytać dane ze standardowego wejścia i wypisać wynik na standardowe wyjście.

Jeśli bardzo zależy ci na czasie to możesz wziąć korepetycje z C++'a.

0

W takim razie skoro łatwo i szybko można się nauczyć programowania strukturalnego w C++ znając Pascala to już wczoraj zacząłem się uczyć.
Dzięki za odpowiedzi i mam nadzieję tak jak zostało napisane nauczyć się w 2-3 tygodnie C++ na takim poziomie, aby sprawnie pisać algorytmy.
Znalazłem kurs z UMK, który opisuje temat bardziej szczegółowo niż main, ale całkiem zwięźle i do tego są ćwiczenia i zadania z rozwiązaniami/sprawdzarkami, poza tym kurs jest przeplatany z nauką algorytmów, więc powinienem dać radę całkiem szybko się z nim uwinąć (oczywiście jednocześnie ucząc się algorytmów, do których mam książki więc nie muszę się ich uczyć przy komputerze).

0

Mało kto też zna C++ na wysokim poziomie. Większość programistów C++ tak naprawdę nie zna mniej intuicyjnych konstrukcji w tym języku.

Mało kto zna Pascala na wysokim poziomie. Większość programistów Pascala zna większość konstrukcji języka, ale tylko ułamek standardowej biblioteki nawet starego TP7, nie mówiąc już o FPC.

0

Skoro temat i tak został odświeżony to zapytam się kilka rzeczy:

  1. Czy opłaca mi się kupować symfonię C++, skoro chcę się uczyć tylko programowania strukturalnego (czyli wiadomo tylko 1 tom się przyda), czy wystarczy kurs którego się uczę + uzupełnienie "Od zera do gier kodera" (+notatki z tego, żeby lepiej zapamiętać).
  2. Widziałem gdzieś książkę o STL (pytanie jest na przyszłość, bo wiadomo na razie by mi się takowa książka nie przydała, ale jak będę trochę umiał C++) w Helionie za 100 zł nie jest to tanio (chociaż do przeżycia, szczególnie jak się Symfonii nie kupi) i tu pytanie, czy jest jakaś całkiem szczegółowa dokumentacja tej biblioteki po Polsku i za darmo?
  3. Tutaj co się obawiam - czy pół roku mi wystarczy na przerobienie i nauczenie się dobrze algorytmów i struktur danych (powiedzmy tak większość algorytmów z książki Banachowskiego, Diksa i Ryttera + drobne uzupełnienia typu teoria liczb, kombinatoryka itp. + Niebieskie książeczki - to powinno wystarczyć, na razie uczę się podstaw tak jak już wcześniej napisałem), z jednej strony myślę, że są ludzie z najlepszych szkół w Polsce, którzy programują dużo pod olimpiadę nawet od gimnazjum, więc są bardzo dobrzy od dawna, z drugiej strony to co napisałem, to jest ok. semestr przedmiotu AiSD na studiach informatycznych, więc spokojnie do przerobienia, jeżeli poświęci się temu sporo czasu (szczególnie, że są wakacje). Więc jak myślicie, jeżeli poświęcę dużo czasu, to czy powinno wystarczyć na finał?
0
  1. Zawsze moze ci się przydać na przyszłość
  2. Nie, opis STL masz porządnie w dokumentacji, książka do tego to zbędny wydatek
  3. Żeby dobrze wypaść na konkursie algorytmicznym musisz miec odpowiednio wysoką wykminę. Znajomość algorytmów moze ci trochę pomóc, ale to umiejętność rozwiązywania problemów jest kluczowa.
0

Symfonia to strata kasy ... Generalnie głupi język i brak tłumaczenie trudnych rzeczy w myśl - i tak tego sie nie nauczą, a maglowanie łatwizny, ten tutek co podałeś też kitowy jest i z błędami. Polecam "Core Inżynierie Oprogramowania C++", do tego jakieś dokumentacje a ksiazek jako takich nie warto, uczysz się z cormena ew z przykładów, a do nauki samego języka starczy ta pozycja co podałem. Nie polecam pisać w strukturalnym, bo moim zdaniem łatwiej np. używać kolejkę priorytetową na wektorze twoich własnych klas i twoim komparatorze niż w strukturach.

0
Shalom napisał(a)
  1. Nie, opis STL masz porządnie w dokumentacji, książka do tego to zbędny wydatek

A jest takie coś po polsku? Bo jeżeli nie to trudno mi będzie dowiedzieć się wszystkiego dobrze i szybko.

Shalom napisał(a)
  1. Żeby dobrze wypaść na konkursie algorytmicznym musisz miec odpowiednio wysoką wykminę. Znajomość algorytmów moze ci trochę pomóc, ale to umiejętność rozwiązywania problemów jest kluczowa.

Tej "wykminy" jak ty to napisałeś można się nauczyć czytając właśnie niebieskie książeczki, więc ok.

lukas_gab napisał(a)

Symfonia to strata kasy ... Generalnie głupi język i brak tłumaczenie trudnych rzeczy w myśl - i tak tego sie nie nauczą, a maglowanie łatwizny, ten tutek co podałeś też kitowy jest i z błędami. Polecam "Core Inżynierie Oprogramowania C++", do tego jakieś dokumentacje a ksiazek jako takich nie warto, uczysz się z cormena ew z przykładów, a do nauki samego języka starczy ta pozycja co podałem. Nie polecam pisać w strukturalnym, bo moim zdaniem łatwiej np. używać kolejkę priorytetową na wektorze twoich własnych klas i twoim komparatorze niż w strukturach.

Pierwszy raz słyszę:

  • taką opinię o Symfonii;
  • nazwę takiej książki;
  • nie polecanie pisania strukturalnych programów na olimpiadzie (do tego gdy zależy mi na tym by jak najszybciej nauczyć się języka).
0

A jest takie coś po polsku? Bo jeżeli nie to trudno mi będzie dowiedzieć się wszystkiego dobrze i szybko.

Angielskiego prędzej czy później będziesz musiał się nauczyć. Myślę, że bardziej prawdopodobne jest, że na OI będziesz miał dostęp do dokumentacji STLa niż do książki typu Symfonia.

Tej "wykminy" jak ty to napisałeś można się nauczyć czytając właśnie niebieskie książeczki, więc ok.

Prawda. Nawet w wywiadach olimpijczycy zaznaczają, że najważniejsza jest praktyka. Zadania wymagają znajomości pewnego zbioru strategii, im więcej strategii znasz tym szybciej wpadniesz na rozwiązanie (tzn zmodyfikujesz lekko już nauczoną strategię).

0

To mam jeszcze dwa pytanie, mam nadzieję, że ostatnie:

  1. Czy biblioteka STL zmieniała się wraz ze standardami C++?
  2. Co daje programowanie obiektowe w prędkości działania i co z niego się przydaje do jak najszybszego pisania algorytmów?
0
  1. Tak, choćby ze względu na dodanie przestrzeni nazw
  2. W szybkości działania? Raczej nic, albo dodatkowo spowalnia bo masz pewien narzut na warstwę abstrakcji. Ale ułatwia pisanie, bo sporo rzeczy robisz w pewnym sensie "niezależnych od siebie". Np. piszesz program który rozwiązuje jakis problem grafowy. Dzięki obiektowości mozesz napisać sobie model grafu i operacje na tym modelu a potem dopiero napisać algorytm który z tych operacji korzysta. W ten sposób dzielisz sobie problem na mniejsze. Pisząc sam algorytm nie musisz myśleć o tym że np. tutaj trzeba przepiąć dwa wskaźniki, tutaj coś dodatkowo pozmnieniać w grafie, bo te operacje wykonuje część odpowiedzialna za sam graf.
0

Ad 2: Porównaj sobie prędkość qsort z std::sort. std::sort wygrywa i to znacznie, ale nie przez to, że ma lepszy algorytm, tylko dzięki obiektowości. qsort jest funkcją biblioteczną i przyjmuje wskaźnik do funkcji porównującej, nie ma możliwości (ZTCW) wklejenia funkcji bezpośrednio (inline). W przypadku std::sort za to kompilator ma szanszę wkleić (inline) funkcję porównującą bezpośrednio do funkcji sortującej, dzięki czemu nie ma narzutu na wywołania funkcji.

0
Wibowit napisał(a)

Ad 2: Porównaj sobie prędkość qsort z std::sort. std::sort wygrywa i to znacznie, ale nie przez to, że ma lepszy algorytm, tylko dzięki obiektowości.

Żartujesz? Tam OOP nie ma wcale, tylko generyczność nie mającą z nim nic wspólnego... Ze względu na implementację szablonów w C++ (i kompilatorach) to faktycznie jest możliwość inline'owania bez większego problemu.

0

Na OI pisze się w C++, bo jest po prostu szybciej. Tak jak poprzednicy napisali, jest masa gotowych struktur/algorytmów, których naklepanie w Pascalu może zając masę czasu, a pozatem można się tam gdzieś pomylić i stracić godzinę na debugowanie.

Jeżeli chodzi o te 'wykminy', to z Niebieskich Książeczek trzeba też wiedzieć co wyciągnąć. Jest kilka schematów powtarzających się w wielu zadaniach, które znać po prostu trzeba. Modyfikacje algorytmów albo nawet samo wykorzystanie pewnych koncepcji jest wręcz kluczowe. Dla przykładu, osobiście jestem zdania, że algorytmu KMR warto jest się nauczyć tylko po to, żeby poznać tę ideę, która nakazuje nam dzielenie słów na partie o długości 2^n. Na tegorocznym drugim etapie OI gadaliśmy o tym pewnego wieczora i nikt nie znalazł żadnego zastosowania KMR, którego nie da się zastąpić zwykłymi hashami w O(n). (Tak, istnieje pewne ryzyko błędu, ale jest ono skrajnie małe. I tak, KMR to też w pewnym sensie hashowanie. ;))

Odnośnie obiektowości, są zwolennicy i przeciwnicy. Czasem trzeba zrobić kilka grafów/drzew przedziałowych i wtedy faktycznie wygodniej jest to upchać w klasy. W większości przypadków jednak się nie przyda.

Makra w C++ też się czasem przydają, chociaż tutaj też zdania są podzielone. Dla mnie o wiele wygodniej jest coś napisać przy pomocy #define FOR(i, a, b) (int i = (a); i <= (b); i++) niż bez tego makra.

Edit:

  1. Nie zawsze w bluebookach są też wszystkie warte uwagi rozwiązania.
  2. Kiedy w bluebooku jest informacja, że rozwiązania z haszowaniem przechodziły, ale tylko przy użyciu DUŻEJ liczby pierwszej, warto sprawdzić czy tą liczbą nie jest przypadkiem 5 ;D

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