Witam.
Zrobiłem zadanie unikaty z main.edu.pl: http://main.edu.pl/pl/user.phtml?op=showtask&task=uni&con=ALG
Niestety dostaję za to zadanie 90 punktów i proszę o pomoc, ponieważ nie mam pojęcia jak ulepszyć program, aby dostawał 100 punktów.
Nie przechodzi jednego testu, przy czym wyskakuje w ramce wynik: błąd wykonania, a niżej informacja: memory limit exceeded kod wyjścia: 1.
Oto kod programu:
#include<cstdio>
int a[20000], b[20000]; // tworze dwie tablica
void merge(int *a, int *b, int p, int q, int r) // scalanie tablic
{
int i = p;
int j = q + 1;
int k = p;
while(i <= q && j <= r)
{
if(a[i]<a[j])
{
b[k] = a[i];
i++;
}
else
{
b[k] = a[j];
j++;
}
k++;
}
while(i <= q)
{
b[k] = a[i];
i++;
k++;
}
while(j <= r)
{
b[k] = a[j];
j++;
k++;
}
for (int c = p; c <= r; c++) // przepisuje tablice a do tablicy b
a[c] = b[c];
}
void mergesort(int *a, int *b, int p, int r) // funkcja sortujaca
{
if(p!=r)
{
int q=(p+r)/2;
mergesort(a, b, p, q);
mergesort(a, b, q+1, r);
merge(a, b, p, q, r);
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0;i<n;i++)
scanf("%d", &a[i]);
mergesort(a, b, 0, n-1); // sortowanie ciagu przez scalanie
int w=1;
for(int i=1; i<n; i++) // zliczam ilosc liczb, ktore wytapily
{
if(a[i] != a[i-1])
w++;
}
printf("%d", w);
return 0;
}