Wysłałem kilka zadanek na Olimpiadę Informatyczną, ale wyskakuje błąd "signal 9" czyli przekroczenie pamięci w niektórych testach. Myślę, że to przez użycie tablicy dynamicznej i chciałbym ją zamienić na inną lecz żeby jako wielkość przyjmowała zmienną.
To przez to, że zużywasz za dużo pamięci, typ alokacji nie ma nic do rzeczy.
Masz zły algorytm lub używasz niepotrzebnie dużych typów danych.
Przykro mi ale nie tędy droga. Jeśli masz w zadaniach na OI przekroczony czas albo pamięć to problemem jest ALGORYTM i STRUKTURY DANYCH a nie technikalia typu sposób alokacji pamięci czy sposób wczytywania wejścia / pisania wyjścia. Jak algorytm jest dobry to program nawet z powolnym I/O przejdzie. A jak algorytm jest zły to nie przejdzie choćbyś nie wiem jak kombinował.
Okazało się, że są problemy ze strumieniami w ich testach i dlatego program wywala ... Po zamianie cin/cout na printf/scanf działa jak należy.
Niemożliwe ;] Błąd musiał być w twoim kodzie - po prostu źle użyłeś strumieni.
Dobrze ci mówią, całkiem możliwe, że w poprzedniej wersji miałeś np wyciek pamięci.
Daj link do zadania i wyłącznie kod wczytujący dane (IMO czymś takim nie naruszysz regulaminu), to pewnie się okaże w czym problem.
Zadanie KIN https://sio2.mimuw.edu.pl/c/oi22-1/p/kin/ http://scr.hu/33r4/04fq2
int n = 0, m = 0, pom = 0;
cin >> n >> m;
int * a = new int[n]{0};
int * b = new int[m];
for (int i = 0; i < n; i++)
{
cin >> pom;
a[i] = pom;
}
for (int i = 0; i < m; i++)
{
cin >> pom;
b[i] = pom;
}
Zadanie PIE https://sio2.mimuw.edu.pl/c/oi22-1/p/pie/ http://scr.hu/33r4/o5z0d
int q = 0, n = 0, m = 0, a = 0, b = 0, wyjscie = 0, error = 0;
cin >> q;
int * wynik = new int[q];
for (int o = 0; o < q; o++)
{
cin >> n >> m >> a >> b;
char ** pismo = new char *[n];
for (int c = 0; c < n; c++)
{
pismo[c] = new char[m];
}
char ** wzor = new char *[a];
for (int d = 0; d < a; d++)
{
wzor[d] = new char[b];
}
for (int k = 0; k < n; k++)
{
for (int l = 0; l < m; l++)
{
cin >> pismo[k][l];
}
}
for (int k = 0; k < a; k++)
{
for (int l = 0; l < b; l++)
{
cin >> wzor[k][l];
}
}
}
W 1 masz "zła odpowiedź" a potem przekroczenie limitu czasu co wskazuje na błędny algorytm i tyle.
W 2 masz błąd wykonania co wskazuje na błędny algorytm. Signal 11 to segmentation fault więc za pewne wyłazisz gdzieś poza przydzielone tablice.
Poza tym generalnie wskazane jest używanie printf/scanf bo są szybsze niż cin/cout, ale mimo to nie powinno to wpłynąć na zaliczenie/niezaliczenie zaadnia z poprawnym algorytmem. Tylko czasy będziesz miał wysokie.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.