Wskazówki (mniej i bardziej banalne):

  • sprawdź czy Twój program działa dla testów przykładowych
  • sprawdź czy Twój program działa dla skrajnych wartości zmiennych - dla dziesięciu pierwszych minimalnych wartości i dziesięciu maksymalnych
  • upewnij się czy typ zmiennych, których używasz jest wystarczająco duży/dokładny; częstym błędem jest stosowanie typu float, który jest niezbyt dokładny - można go zastąpić typem double lub long double; floata w zasadzie nie używaj; tak samo z short intem
  • sprawdź czy dobrze operujesz na typach zmiennych. Oto kilka przykładów pomysłu Mieczysława Bejnara:

    PRZYKŁAD #1:

    int a = 7, b = 2; double c; c = a / b; // ŹLE! // Zmienne a i b są całkowitoliczbowe, a zatem wynik operacji dzielenia będzie również całkowitoliczbowy. // Zamiast liczby 3,5 otrzymamy 3. c = (double)a / b; // Dobrze! // Zmienna a jest rzutowana do typu double. Podczas wykonywania dzielenia zmienna b zostanie również niejawnie // skonwertowana do typu double, jako że z tej pary (double, int) jest on bardziej dokładny. // Wynikiem operacji dzielenie będzie zgodnie z oczekiwaniami liczba 3,5.

    PRZYKŁAD #2:

    int a = 100, b = 200, c = 300; double d; d = a * b * c / 1983; // ŹLE! // Podobnie jak w przykładzie poprzednim wszystkie zmienne oraz stała są całkowitoliczbowe, zatem nie otrzymamy // oczekiwanego wyniku: 3025,72. W tym wypadku problem ten możemy rozwiązać zmieniając typ stałej poprzez jej // inny zapis. d = a * b * c / 1983.0; // Dobrze! // Stała 1983 jest obecnie traktowana jako liczba zmiennoprzecinkowa typu double, a zatem podobnie jak poprzednio // wynik również będzie zmiennoprzecinkowy. Wystarczy jednak lekko zmodyfikować wartości zmiennych, aby pojawił // nam się inny problem. a = 1000; b = 2000; c = 3000; d = a * b * c / 1983.0; // ŹLE! Pierwsze dwie operacje jakie zostaną wykonane to mnożenie całkowitoliczbowe z wykorzystaniem typu int. // Wynik operacji mnożenia to 6 × 109, tymczasem maksymalna dodatnia wartość jaką może przechowywać // typ int to około 2,14 × 109 (dokładnie 231-1)! W tym wypadku nastąpi zatem // przekroczenie zakresu typu int. Rozwiązaniem tego problemu może być ponownie odpowiednie rzutowanie: d = (long long int)a * b * c / 1983.0; // albo d = (double)a * b * c / 1983.0; // Dobrze! Zarówno long long int jak i double mają wystarczające zakresy wartości do przechowania wyniku mnożenia.

    PRZYKŁAD #3:

    #include <cmath> ... double a = 0.1; if (a * 1000.0 == 100.0) { ... } // Niebezpieczne porównanie! // W przypadku typów zmiennoprzecinkowych mogą występować błędy zaokrągleń wpływające chociażby na wyniki porównań. // Bezpieczniej zatem jest dokonywać porównań zachowując dopuszczalną granicę błędu. Zazwyczaj wartość dopuszczalnej // granicy błędu mieści się w przedziale od 10-9 do 10-6. const double EPS = 0.000000001; // Dopuszczalna granica błędu. if (fabs((a * 1000.0) - 100.0) < EPS) { ... } // Dobrze!

  • upewnij się, że w funkcjach np. scanf, printf odpowiednio deklarujesz format zmiennej czyli np. do zmiennej long long int odwołujesz się używając %lld, a nie %d (typ int)
  • przeczytaj również komentarze pod zadaniem - czasem są w nich jakieś pytania i wyjaśnienia
  • sprawdź czy Twój program nie wyświetla niczego niepotrzebnego, o czym nie było mowy w specyfikacji wyjścia; np. cout << "Podaj liczbę x:" << endl; - SPOJ to nie człowiek, ale robot, więc jest bardzo precyzyjny w sprawdzaniu - trzeba zatem ściśle przestrzegać specyfikacji wejścia/wyjścia
  • pamiętaj, że liczy się wynik - nie ważne jak wczytasz dane - na początku czy w trakcie (choć ważne, żebyś wczytał je poprawnie), nie ważne jest także kiedy je wypiszesz, ważne jest natomiast, żeby były poprawne; nie musisz więc tablicować wyników i czekać z wypisaniem ich na koniec, nie musisz też wczytywać całego wejścia na początku i tablicować go; nie jest to oczywiście zabronione, ale po co sobie utrudniać życie i marnować pamięć?
  • potrzebując tablicy z piętnastoma elementami pamiętaj, że tablice są indeksowane od 0 - daj więc przynajmniej o jeden element większą tablicę; najlepszym jednak wyjściem jest danie znacznie większej tablicy - dla małych rozmiarów lub tablicy większej np. o 99 - dla dużych rozmiarów; np. zamiast tablicy int tab[51]; daj int tab[251];, a zamiast tablicy int tab[1000001]; daj int tab[1000099];
  • upewnij się, że pisząc w C umieściłeś/aś na końcu programu return 0;, a w C++ jeśli korzystasz z cin/cout dodałeś/aś instrukcję ios_base::sync_with_stdio(false);
  • mając dane w zadaniach ograniczenia, nie musisz pisać warunku, który sprawdza czy są przestrzegane; (np. w zadaniu: n < 1000, a w programie: cin >> n; if (n < 1000) {...};) możesz przyjąć, że specyfikacja wejścia i wyjścia jest poprawna
  • wypisuj wyjście w dokładnie takim formacie, jak w zadaniu; jeśli więc wypisujesz dane w pętli (1 obieg pętli - 1 test), to pamiętaj, żeby wyniki oddzielić enterami lub spacjami; jeśli tego nie zrobisz, dla poprawnego wyjścia 1 2 3 4 5 Twój program wypisze 12345, przez co nie zostanie zaliczony. Zwróć również uwagę na wielkość liter wypisywanego tekstu: jeśli masz wypisać TAK, a wypiszesz tak, dostaniesz błędną odpowiedź
© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.