Tablice na Olimpiadzie Informatycznej

0

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ą.

2

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.

0

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ł.

0

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.

1

Niemożliwe ;] Błąd musiał być w twoim kodzie - po prostu źle użyłeś strumieni.

0

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.

0

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];


			}
		}
}
0

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.

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