Różne wyniki na 2 systemach

0

Witam, rozwiązuję zadanie: http://main.edu.pl/pl/archive/oig/5/zap
Napisałem taki program:

 #include <iostream>

using namespace std;

int main()
{
	unsigned long long int N;
	cin>>N;
	bool *zap=new bool[N];
	unsigned long size=0;
	for(unsigned long long int i=0;i<N;i++)
	{
		cin>>zap[i];
		if(zap[i-1]==0 && zap[i]==1)
		{
			zap[i]=0;
			size++;
		}
	}
	cout<<size;
	return 0;
}

Gdy testuję go na swoim komputerze daje on dobrą odpowiedź w każdych przypadkach testowych(ściągnąłem testy z main.edu.pl), gdy wysyłam na platformę dostaję złe wyniki. Możecie mi powiedzieć czemu tak się dzieje.

0

Dodam jeszcze żę oni testują to na linuxie, a ja na windowsie :)

1

Odwolujesz sie do nieistniejacych elementow tablicy. Prawdopodobnie pamiec procesu jest zerowana w tamtym systemie, natomiast w Twoim nie jest. Co daje dla przypadku testowego wynik: 3.

0

Poprawiłem, zaliczyło więcej testów, ale dalej nie wszystkie:

#include <iostream>

using namespace std;

int main()
{
	unsigned long long int N;
	cin>>N;
	short *zap=new short[N];
	unsigned long size=0;
	for(unsigned long long int i=0;i<N;i++)
	{
		cin>>zap[i];
		if(i>0 && zap[i-1]==0 && zap[i]==1)
		{
			zap[i]=0;
			size++;
		}
	}
	cout<<size;
	return 0;
} 
1

Pierwsza myśl: po co w ogóle używasz do tego celu tablicy? Oraz dlaczego ta tablica nie jest zwykłą tablicą bool-ów?
Albo lepiej (jeżeli chcesz trzymać się mimo wszystko tablic): zmień jej typ na uint8 oraz twórz ją osiem razy mniejszą; dzięki temu będziesz mógł w jednym elemencie tablicy trzymać osiem bool-ów (z tym, że będziesz musiał użyć operacji bitowych do wyłuskania oraz ustawienia wartości).
Zaraz przyjrzę się jeszcze samemu algorytmowi...

0
  1. Dlaczego tworzysz tablicę dynamicznie skoro w treści masz wszelkie limity. Stwórz na początku tablicę globalną o rozmiarze maksymalne n + jakaś stała (warto dawać stałą na wszelki wypadek, np. ja daję 9).

  2. Po co Ci unsigned long long skoro wszystko na luzie zmieści się w incie. Mniej pisania, a do tego możesz przekraczać pamięć przez te long longi.

  3. Jeżeli używasz strumieni to pisz ios_base::sync_with_stdio(0); na początku programu, inaczej możesz przekraczać limit czasu przez zbyt wolne działanie operacji wejścia-wyjścia.

To takie uwagi ogólne - samo zadanie jest łatwe i nie wiem dlaczego niby faktycznie miałaby być inna odpowiedź u Ciebie i na sprawdzarce - kompilujesz za pomocą g++ na linuxie? Jeśli zamierzasz brać udział w OIG/OI to polecam kompilować za pomocą g++ w linuxie.

Albo lepiej (jeżeli chcesz trzymać się mimo wszystko tablic): zmień jej typ na uint8 oraz twórz ją osiem razy mniejszą; dzięki temu będziesz mógł w jednym elemencie tablicy trzymać osiem bool-ów (z tym, że będziesz musiał użyć operacji bitowych do wyłuskania oraz ustawienia wartości).

Tablica booli byłaby w porządku, bo jest prostsza, a powinna się zmieścić w pamięci.

0

Dołóż warunek na koniec: if(N<2*size) size=N-size;

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