« Mam problem z zadaniem ze SPOJa, pytanie/odpowiedź »
O różnych podstawowych sprawach powodujących u początkujących problemy z automatycznie sprawdzanymi zadaniami. (pytanie/odpowiedź)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Autor: pekfos
FAQ

Mam problem z zadaniem ze SPOJa

[pytanie/odpowiedź] O różnych podstawowych sprawach powodujących u początkujących problemy z automatycznie sprawdzanymi zadaniami.

Standardowe wejście i wyjście są od siebie niezależne!

Jak wyżej. Standardowe wejście i wyjście są od siebie niezależne! Większość początkujących błędnie zakłada, że standardowe wejście i wyjście to jest po prostu to, co się widzi w konsoli. A przez to, że widzi się je w jednej konsoli, to pewnie można je przypadkiem pomieszać, więc jak SPOJ najpierw podaje dane i potem sprawdza wyniki, to trzeba wczytać wszystkie dane, żeby potem wypisać wszystkie wyniki. A żeby to zrobić, trzeba gdzieś dane zapisać, więc w kodzie pojawia się wektor, który bezsensownie użyty marnuje czas i pamięć - cenne i ograniczone zasoby.
Przykładowe zadanie:
Wejście:
N - liczba przypadków testowych [ Niezależnych! ]
Dla każdego przypadku testowego:
a b - liczby do dodania

Wyjście:
N wyników dodawania a+b
C/C++
#include <iostream>

int main()
{
    int N;
    std::cin >> N; // Ilość przypadków testowych
   
    for( int i = 0; i < N; ++i )
    {
        int a, b;
        std::cin >> a >> b; // Liczby do dodania
        std::cout << a + b << '\n'; // Wynik.
    }
}
Z perspektywy użycia tego programu w konsoli i ręcznego wprowadzania danych, dane są przemieszane z wynikami, co nie ma najmniejszego znaczenia, bo to jest po prostu efekt tego, że dane z wejścia i wyjścia są wyświetlane w jednym miejscu.
4
1 2
3
4 5
9
11 0
11
100 200
300
Na SPOJu i innych automatycznych sprawdzarkach dane są zwykle wczytywane z pliku, więc mamy sobie plik dane.txt:
4
1 2
4 5
11 0
100 200
Uruchamiamy program z przekierowaniem pliku na standardowe wejście (Plik jest użyty tylko w poleceniu uruchamiającym program, nie w kodzie programu!):
C:\>a <dane.txt
3
9
11
300
I na wyjściu są wyświetlane tylko wyniki, bo standardowe wejście jest związane z plikiem, nie konsolą. Podobnie można przekierować wyjście, do pliku, czy nawet na wejście innego programu, więc nic nie musi być nigdy wyświetlane. Przypominam, że programy sprawdza automat.
Jak pracujesz przy zadaniu, które wymaga dużo danych, przekierowuj je z pliku, zamiast kopiować, czy wpisywać ręcznie. Work smarter, not harder.