Optymalizacja czasu wykonania zadania Spoj

0

By podszlifować swoje umiejętności zabrałem się za rozwiązywanie zadań spoja

Wykonałem zadanie pl.spoj.com/problems/RNO_DOD/ proste dodawanie
i spróbowałem maksymalnie z optymalizować swój kod :

#include <iostream>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int *p;
	
	p = new int [4];
	*(p + 3) = 0;
	*(p + 2) = 0;

	cin >> *p;

	while ((*p)--) {
		cin >> *(p+1);
		while ((( * (p + 1)))--) {

			cin >> *(p+2);
			*(p+3) += *(p+2);


		}
		cout << *(p+3) << "\n";
		*(p+3 )= 0;
	}
	delete [] p;
	
	return 0;
}

Mimo moich starań nie udało mi się zejść poniżej 0.01 s i użycia 5.2M pamięci (CPP14)

Wchodzą na listę najlepszych kodów z tego zadania inni użytkownicy korzystając z C++ uzyskali czas poniżej 0.01 i 2.5M pamięci

Mam więc małe pytanie jak jeszcze mógłbym z optymalizować kod by otrzymać takie wyniki jak inni.

2
*(p + 3) = 0;

A czy to nie znaczy przypadkiem to samo co

p[3] = 0;

?

p = new int [4];

Czy to, co robisz później z tym p, nie spowoduje czasem tego, że będziesz się odwoływać do pamięci, która nie jest tobie należna? Anyway ten kod jest dla mnie totalnie niezrozumiały.

Ja wpadłem na takie rozwiązanie:

#include <iostream>
using namespace std;

int main() {
    int tests;
    cin >> tests;
    for (int i = 0; i < tests; i++) {
        int sum = 0;
        int numbers;
        cin >> numbers; 
        for (int i = 0; i < numbers; i++) {
            int n;
            cin >> n;
            sum += n;
        }
        cout << "suma: " << sum << "\n";
    }
    return 0;
}

Ale nie wiem, jak sprawdzić jego zużycie pamięci. Chociaż dodałem while (true) {} na końcu i otworzyłem top i pokazuje mi 284K w pamięci na macOS (nie wiem, czy to się tak powinno sprawdzać, po prostu to pierwsza rzecz, jaka mi przyszła do głowy. Z drugiej strony to i tak nie sprawdzi tego, jakie były alokacje wcześniej, więc w sumie co sprawdziłem? Ile zajmuje sam odpalony program pewnie). Przy czym daję na wejściu ten przykładowy plik z dwoma testami.

jeszcze tutaj znalazłem trick, jak można sprawdzić zużycie pamięci: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

1
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	istream_iterator<int> iin(cin);
	for(int sum=0,t=*iin;t--;cout<<sum<<endl,sum=0) for(int n=*++iin;n--;) sum+=*++iin;
	return 0;
}

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