[ RooTeR @ 16.07.2005. 15:29 ] @
Zadatak je sa saveznog 2002 valjda ... (ima ga na www.z-trening.com)

Dato je n kutija (n<=10000), i za svaku je dat prechnik osnove i visina. Kutija A se moze
staviti u kutiju B samo ako joj ni visina ni prechnik nisu veci od prechnika i visine kutije
B. Date kutije treba smestiti tako da na kraju ostane minimalan broj vidljivih kutija.

Primer: Dato je 5 kutija: jedna sa precnikom 20 i visinom 30, druga sa precnikom 30 i
visinom 20, treca sa precnikom 40 i visinom 40, cetvrta sa precnikom 10 i visinom 30 i
peta sa precnikom 15 i visinom 15. Tada je moguce smestiti cetvrtu kutiju u prvu, a
zatim prvu u trecu, kao i petu kutiju u drugu. Tako ostaju dve vidljive kutije: druga i
treca. Medutim, nikako nije moguce smestiti sve kutije u jednu, pa je 2 ovde rešenje.

Ulaz:
5
20 30
30 20
40 40
10 30
15 15

Izlaz:
2


E sad, ja sam tu svashta probao, ali mi je sve sporo ... neka ideja? cassey :)
[ cassey @ 16.07.2005. 20:05 ] @
Sladak zadatak. Sad tacno nemam vremena da razmislim ali koliko se secam radi se tipa: sortiras po npr. visini (a naravno menjas i pozicije osnova) i onda u tom novodobijenom nizu osnova trazis najduzi rastuci podniz (ili opadajuci zavisno kako sortiras visine). Pa navedeni primer:

= precnik
= visina

Posle sortiranja




i sad u drugom nizu trazis duzinu najduzes rastuceg podniza sto jelte .

Ja mislim da je dokaz trivijalan...

Slozenost ti je u (za najduzi rastuci podniz ces raditi onaj algoritam u koji ti samo daje duzinu najduzeg rastuceg podniza a ne onaj u koji i rekonstruise sam niz)
[ NrmMyth @ 16.07.2005. 20:49 ] @
Citat:
Posle sortiranja




i sad u drugom nizu trazis duzinu najduzes rastuceg podniza sto jelte .

Ovdje je naduzi rastuci podniz 3 (15,20,40 ili 15,30,40).

Moje misljenje je da bi ovaj problem se mogao svrstati u Greedy algoritam.
Prvo stabilni sort po precnici pa visini (zbog mogucnosti istih precnica).

Nadalje, implementiraj prolazak kroz taj niz kutija, tako da uzmes prvu najvecu kutiju pa u nju stavljas svaku sljedecu koja moze uci po visini u tu prijasnju.
Kad tako izbacis nekoliko kutija ponovi postupak za preostale.
Koliko si puta ponavljao postupak, toliko imas sve ukupno kutija - rijesenje!

90% sam siguran da bi ti ovaj GREEDY mogao upaliti !
[ RooTeR @ 17.07.2005. 00:48 ] @
Ovaj, cassey ... mislim da tvoje reshenje ne radi bash najsrecnije (tachnije, ne radi nikako :)

A iskreno mislim da bi greedy ovde proshao za svega par primera ...

Slazem se da je lep/sladak zadatak :)
[ cassey @ 17.07.2005. 01:22 ] @
Greedy nece da prodje ni za 2-3 test primera to je sigurno. I ako neko ima test primere neka pogleda i videce da nije ni priblizno dobro (a ni pametno) kucati greedy... Ovo, da ja sam pogresio ali sam siguran da je nesto bilo na tu foru... Evo moj kod pa provalite jer ja nemam trenutno vremnena...

Code:

program Kutije;
const
    MaxN = 10000;
var
  q, d, h: array [1.. MaxN] of LongInt;
    n, Sol, br: LongInt;
  f, g: Text;

  procedure InPut;
  var
      i: LongInt;
  begin
      {Assign (f, 'zad5.dat');
    Reset (f);}
    Read (n);
    for i := 1 to n do
        Read (d [i], h [i]);
    {Close (f);}
  end;

  procedure Quick_Sort (l, r: LongInt);
  var
      q, p, tmp, k, i, j: LongInt;
  begin
    if l < r then begin
          k := (l + r) DIV 2;
        i := l; j := r;
      p := d [k];
      q := h [k];
        repeat
        while (i < r) and (d [i] > p) or
            ((d [i] = p) and (h [i] > q)) do Inc (i);
        while (j > l) and (d [j] < p) or
            ((d [j] = p) and (h [j] < q)) do Dec (j);
            if i <= j then begin
                tmp := d [i]; d [i] := d [j]; d [j] := tmp;
                tmp := h [i]; h [i] := h [j]; h [j] := tmp;
              Inc (i); Dec (j);
            end;
        until i > j;
        Quick_Sort (l, j);
        Quick_Sort (i, r);
    end;
  end;

  function Find (p, k, x: LongInt): LongInt;
  var
      tmp: LongInt;
    begin
      if (k - p > 1) then begin
        tmp := (p + k) DIV 2;
      if (q [tmp] > x) then
          Find := Find (p, tmp, x)
      else
          Find := Find (tmp, k, x);
    end
    else
        if (x <= q [p]) then Find := p
      else Find := k;
  end;

  procedure Solve;
  var
    i, j: LongInt;
  begin
      Quick_Sort (1, n);

    q [1] := h [1];
    br := 1;
    for i := 2 to n do begin
        if h [i] >  q [br] then
          j := br + 1
      else
          j := Find (1, br, h [i]);
      q [j] := h [i];
      if j > br then br := j;
    end;
    Sol := br;
  end;

  procedure OutPut;
  begin
      {Assign (g, 'zad5.res');
    ReWrite (g);}
    WriteLn (Sol);
    {Close (g);}
  end;

begin
    InPut;
  Solve;
  OutPut;
end.
[ RooTeR @ 17.07.2005. 11:14 ] @
Ok, hvala ti!
[ RooTeR @ 18.07.2005. 00:10 ] @
Uhmm... pa manje vishe sam ukapirao reshenje ... u svakom sluchaju, ne verujem da bi se ovoga sam setio ... mada, ja sam najduzi podniz radio drugachije od ideja koja se ovde primenjuje, tako da je moguce to razlog ... :)
Lep zadatak, u svakom sluchaju ...
[ cassey @ 18.07.2005. 00:21 ] @
Pa da bi zadatak resio u moras da trazis NRP (najduzi rastuci podniz) na ovaj nacin, koji ne rekonstrusise sam NRP... Neznam kako bi to drugacije uradio?! (slazemo se da je rekonstrukcija u koja ti ovde nije potrebna)...