VIII Mistrzostwa WWSI w Programowaniu

Dobre rady

Uwaga! Jak tylko zaświta nam w głowie kolejna genialna rada od razu ją tu umieścimy, dlatego też radzimy odwiedzać to miejsce regularnie.

  1. Osobom, które po raz pierwszy biorą udział w zawodach tego typu polecamy przeczytanie artykułu naszego autorstwa zatytułowanego "Wprowadzenie w rozwiązywanie konkursowych zadań programistycznych". Artykuł ten jest również dostępny w Zeszytach Naukowych nr 3 wydanych przez naszą uczelnie.
  2. Czytaj dokładnie treść zadania! W szczególności zwracaj uwagę na specyfikację wejścia, czyli to co twój program powinien wczytać z klawiatury oraz specyfikację wyjścia czyli to co powinien wypisać na ekranie.
  3. Sprawdzanie poprawności rozwiązań działa na zasadzie porównania dwóch plików tekstowych. Pierwszy z nich zawiera wyniki wypisane przez twój program zaś drugi wyniki wypisane przez program wzorcowy. Z tego powodu nie należy wypisywać żadnych informacji, które nie są określone w specyfikacji wyjścia. Wysłanie na ekran chociażby jednego komunikatu np. "Podaj ilość zestawów danych" automatycznie powoduje uzyskanie werdyktu błędna odpowiedź (WA).
  4. Uzyskanie dobrych wyników dla testów przykładowych nie gwarantuje tego, że Twoje rozwiązanie jest poprawne lub wydajne. Zawsze staraj się dokładnie przetestować swój program wymyślając inne testy poprawnościowe lub wydajnościowe. Test wydajnościowy najlepiej jest stworzyć sobie za pomocą kolejnego własnego programu, który go wygeneruje i zapisze do pliku.
  5. Jeżeli masz problem z rozwiązaniem jakiegoś zadania skorzystaj z literatury dostępnej w naszej bibliotece. Nie ma sensu wchodzenie oknem tam gdzie ktoś już otworzył drzwi. Szczególnie polecane przez nas książki to:
    • "Algorytmika praktyczna nie tylko dla mistrzów" - Piotr Stańczyk
    • "Wprowadzenie do algorytmów" - Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest
    • "Algorytmy i struktury danych" - Lech Banachowski, Krzysztof Diks, Wojciech Rytter
    • "Matematyka dyskretna" - Kenneth A. Ross, Charles R. B. Wright
    • "Zeszyty Naukowe Nr 3" - Warszawska Wyższa Szkoła Informatyki
  6. W zadaniach z dużą ilością danych wejściowych staraj się unikać używania języków Java oraz C#. Programy w nich napisane działają dłużej od tych napisanych w C/C++ czy Pascalu.
  7. Jeżeli ilość zestawów danych w zadaniu jest nieokreślona to oznacza to, że należy je wczytywać aż do napotkania znacznika końca pliku (EOF). Można np. skorzystać z wartości zwracanych przez funkcję scanf. Funkcja ta domyślnie zwraca ilość wczytanych elementów, jeżeli będzie ona różna od oczekiwanej to oznacza to, że nie ma więcej zestawów danych.
  8. Pisząc programy w języku C należy pamiętać o zamieszczeniu instrukcji return 0; na końcu funkcji main w przeciwnym wypadku otrzymamy werdykt błąd wykonania (NZEC).
  9. Jeżeli do wczytywania/wypisywania danych w języku C++ używamy instrukcji cin/cout to należy pamiętać o wyłączeniu synchronizacji ze strumieniami z biblioteki cstdio za pomocą instrukcji ios_base::sync_with_stdio(false); przed rozpoczęciem wczytywania danych.
  10. W przypadku zmiennych rzeczywistych nie stosuj typów danych o małej precyzji takich jak np. float.
  11. Dobierając typ danych zawsze upewnij się, że będzie w stanie przechowywać maksymalne wartości określone w treści zadania. Może się zdarzyć, że np. zamiast 32 bitowych zmiennych całkowitych będziesz musiał użyć zmiennych 64 bitowych.
  12. Nie sprawdzaj poprawności wczytywanych danych, to zwykła strata czasu. Jeżeli w treści zadania jest napisane, że liczba d będzie miała wartość pomiędzy 1 a 1000 to tak będzie.
  13. Jeżeli w zadaniu występują zestawy danych to nie należy najpierw wczytywać wszystkich danych a dopiero potem wykonywać dla nich obliczenia i wypisywać wyniki. Jest to strata pamięci, bo przecież gdzieś te dane trzeba przechować, a także "brudzenie" sobie w kodzie. Obliczenia i wypisywanie wyniku należy wykonywać zaraz po wczytaniu każdego zestawu danych.