Witam, wiem że na forum znajduję się już temat z identycznym problemem, jednak jest on przedstawiony dla języka C++, którego nie zdążyłem jeszcze przyswoić.
Zadanie znajdziecie pod tym linkiem:
http://main.edu.pl/pl/user.phtml?op=showtask&task=prze&con=PAS
Po wysłaniu odpowiedzi dostaje 40/100pkt.
Z tego co widzę to problem zaczyna się, jeśli przedziałów jest więcej niż 200 (przy 200 jeszcze mi zalicza). Chociaż może to zwykły zbieg okoliczności i wszystko zależy od sposobu rozmieszczenia przedziałów w ciągu i od mojego błędnego algorytmu.
Oto kod programu:
type tablica = array[1..5000] of longint;
var x,y : tablica;
n,k,i,j,p,z : longint;
a,b : longint;
c : byte;
begin
k:=2;
readln(n);
read(x[1]);
readln(y[1]);
for i:=2 to n do
begin
z:=0;
read(a);
readln(b);
for j:=1 to k-1 do
begin
if (a<=y[j]) and (b>=x[j]) or
(x[j]>=a) and (y[j]<=b) or
(a=y[j]+1) or (b=x[j]-1) then
begin
if a<x[j] then
x[j]:=a;
if b>y[j] then
y[j]:=b;
z:=z+1;
break;
end
else
if (z=0) and (j=k-1) then
begin
x[k]:=a;
y[k]:=b;
k:=k+1;
end;
end;
end;
z:=0;
if k>2 then
begin
repeat
for i:=1 to k-2-z do
begin
c:=0;
for j:=i+1 to k-1-z do
begin
if (x[i]=y[j]+1) then
begin
x[i]:=x[j];
c:=c+1;
for p:=j to k-1-z do {przsun}
begin
x[p]:=x[p+1];
y[p]:=y[p+1];
end;
z:=z+1;
break;
end;
if (y[i]=x[j]-1) then
begin
y[i]:=y[j];
c:=c+1;
for p:=j to k-1-z do {przsun}
begin
x[p]:=x[p+1];
y[p]:=y[p+1];
end;
z:=z+1;
break;
end;
end;
if c>0 then
break;
end;
until i=k-2-z;
end;
writeln(k-1-z);
end.
Wiem że kod jest mało profesjonalny i nazwy zmiennych nic nie mówią, dlatego w razie wątpliwości proszę pytać.
Algorytm wygląda mniej więcej tak:
-
W dwie tablice wpisuje dane.
W tablice "x" pierwszą współrzędną przedziału, a w "y" drugą.
Na początku tablice mają tylko jeden element. Po wpisaniu kolejnego sprawdzane jest czy będzie tworzył wspólny przedział z pierwszym (przypominam że to przedziały liczb całkowitych, dlatego nawet jeśli będą położone +/- 1 obok siebie będą wspólnym przedziałem). Jeśli nie, dopisywany jest kolejny element do tablic. Jednocześnie zwiększana jest zmienna "k". Itd... -
Po umieszczeniu wszystkich przedziałów jeszcze raz sprawdzane jest, czy aby na pewno nie leżą "koło siebie". Jeśli tak parametry zostają zmienione, zmienna "z" wzrasta o 1, a elementy tablic zostają przesunięte.
-
Na wyjściu wynik: różnica liczby "k' i "z".
Proszę o wskazówki gdzie popełniłem błąd.