Dakle ideja je ovakva:
Radi se dinamicki, sortiramo po krajevima i krenemo od pocetka.
OPT[x] je niz koji oznacava najbolje za prvih x filmova (prvih x mislim kad se sortira po krajevima). Binarnom pretragom nadjem od koliko krajeva do x-tog je veci x-ti pocetak, i onda je
OPT[x]=max{ OPT[x-1], vrednost[x]+OPT[od onoliko filmova od koliko je veci levi kraj x-tog filma}
Koliko ja vidim, ideja je u redu, ako nije ne citaj dalje, nego hvataj tastaturu u ruke i pisi zasto nije dobra.
Takav kod ne prolazi za sest test-primera i sad moguce je da imam gresku u kodu (verovatno kod binarnog pretrazivanja i pamcenja indexa) tako da evo ga kod ako nekog ne mrzi, nek pogleda (lakse ce se snaci oni koji su zadatak resavali sa ovom idejom)
type
TFilm=record
p,k,o:longint;
end;
var
film:array [1..100001] of TFilm;
opt:array [0..100001] of longint;
n, i, j:longint;
procedure qs(l,d:longint);
var
i,j,x:longint;
y:TFilm;
begin
i:=l; j:=d; x:=film[(l+d) div 2].k;
repeat
while film[i].k<x do i:=i+1;
while x<film[j].k do j:=j-1;
if i<=j then begin
y:=film[i]; film[i]:=film[j]; film[j]:=y;
i:=i+1; j:=j-1;
end;
until i>j;
if i<d then qs(i,d);
if l<j then qs(l,j);
end;
function max(a,b:longint):longint;
begin
max:=a; if a<b then max:=b;
end;
function binTraz(x, ind:longint):longint;
var
l,d,index,sr:longint;
uspeh:boolean;
begin
l:=1; d:=ind;
uspeh:=false;
index:=-1;
repeat
sr:=(l+d) div 2;
if x=film[sr].k then begin
uspeh:=true;
index:=sr
end
else begin
if x>film[sr].k then l:=sr+1
else d:=sr-1
end
until (d<l) or uspeh;
if uspeh then binTraz:=index-1
else binTraz:=d
end;
begin
readln(n);
for i:=1 to n do readln(film[i].p, film[i].k, film[i].o);
fillChar(opt, sizeOf(opt), 0);
qs(1,n);
opt[0]:=0;
opt[1]:=film[1].o;
for i:=2 to n do
opt[i]:=max(opt[binTraz(film[i].p,i)]+film[i].o, opt[i-1]);
writeln(opt[n]);
end.
Radi se dinamicki, sortiramo po krajevima i krenemo od pocetka.
OPT[x] je niz koji oznacava najbolje za prvih x filmova (prvih x mislim kad se sortira po krajevima). Binarnom pretragom nadjem od koliko krajeva do x-tog je veci x-ti pocetak, i onda je
OPT[x]=max{ OPT[x-1], vrednost[x]+OPT[od onoliko filmova od koliko je veci levi kraj x-tog filma}
Koliko ja vidim, ideja je u redu, ako nije ne citaj dalje, nego hvataj tastaturu u ruke i pisi zasto nije dobra.
Takav kod ne prolazi za sest test-primera i sad moguce je da imam gresku u kodu (verovatno kod binarnog pretrazivanja i pamcenja indexa) tako da evo ga kod ako nekog ne mrzi, nek pogleda (lakse ce se snaci oni koji su zadatak resavali sa ovom idejom)
type
TFilm=record
p,k,o:longint;
end;
var
film:array [1..100001] of TFilm;
opt:array [0..100001] of longint;
n, i, j:longint;
procedure qs(l,d:longint);
var
i,j,x:longint;
y:TFilm;
begin
i:=l; j:=d; x:=film[(l+d) div 2].k;
repeat
while film[i].k<x do i:=i+1;
while x<film[j].k do j:=j-1;
if i<=j then begin
y:=film[i]; film[i]:=film[j]; film[j]:=y;
i:=i+1; j:=j-1;
end;
until i>j;
if i<d then qs(i,d);
if l<j then qs(l,j);
end;
function max(a,b:longint):longint;
begin
max:=a; if a<b then max:=b;
end;
function binTraz(x, ind:longint):longint;
var
l,d,index,sr:longint;
uspeh:boolean;
begin
l:=1; d:=ind;
uspeh:=false;
index:=-1;
repeat
sr:=(l+d) div 2;
if x=film[sr].k then begin
uspeh:=true;
index:=sr
end
else begin
if x>film[sr].k then l:=sr+1
else d:=sr-1
end
until (d<l) or uspeh;
if uspeh then binTraz:=index-1
else binTraz:=d
end;
begin
readln(n);
for i:=1 to n do readln(film[i].p, film[i].k, film[i].o);
fillChar(opt, sizeOf(opt), 0);
qs(1,n);
opt[0]:=0;
opt[1]:=film[1].o;
for i:=2 to n do
opt[i]:=max(opt[binTraz(film[i].p,i)]+film[i].o, opt[i-1]);
writeln(opt[n]);
end.