Informatika gyűjtemény

Egy szinttel feljebb Megoldás

2004050607080910

NézetNyomtat

Megoldás

Átfogalmazzuk a vírusok intervallumba tartozására kapott három egyenlőtlenséget: egy K kezdési idejű P pusztulási idejű (a továbbiakban K-P) vírus akkor van egy T kezdetű H hosszú intervallumban, ha:
  • A vírus létezett a T, T+1, ..., T+H-1 időpontok valamelyikében.
  • A vírusról tudjuk, hogy a K, K+1, ..., P-1 időpontokban létezett.

1. megoldás

Felveszünk egy 7000 elemű tömböt, minden eleme egy időpontot reprezentál. Legyen virusok[t] értéke a T kezdetű, H hosszú időintervallumban megfigyelhető vírusok száma. Ezen tömb értéke a bemeneti fájl betöltése közben meghatározható: kezdetben minden eleme nulla, majd minden vírusra növeljük a megfelelő elemeket. Végül a tömbökből egy maximum-kereséssel kiolvashatók a keresett eredmények.
Eljárás VirusBetesz(k, p)
    k := k - h + 1;
    Ha k < 1 Akkor k := 1;
    Ciklus i := k-tól p-1-ig 
        virusok[i]:= virusok[i]+1;
    Ciklus Vége
Eljárás Vége
Ez az algoritmus $O\left(N \left(h_{\'{a}}+H\right) \right)$ időben fog lefutni, ahol $h_{\'{a}}$ a vírusok életének átlagos hossza.

2. megoldás

Programunkon a VírusBetesz() eljárá konstans idejűvé tételén lehet gyorsítani. A virus tömb helyett használjuk inkább a virus2[] tömböt, amit a következő módon hozunk létre:
Eljárás VírusBetesz(k, p)
    k := k - h + 1;
    Ha k < 1 Akkor k := 1;
    virus2[k]:= virus2[k] - 1;
    virus2[p]:= virus2[p] + 1;
Eljárás Vége
Végiggondolható, hogy innen: virus2[1] = virus[1], majd i > 1-re: virus2[i] = virus[i] - virus[i-1]. Így a maximumkiválasztási ciklusban az eredeti tömb értékét egy számlálóv-változóval nyerhetjük vissza.
Így ez az algoritmus már lefut $O\left(N\right)$ időben...

Megjegyzés

A verseny elvárásaitól függ, hogy egy ilyen gyorsítását meg kell-e írni. OKTV/NTTV versenyeken valószínűleg nem fog kelleni...
TODO:
idő-összehasonlítás a két program között, rajzok, részletezés(?)

Megoldások

fg_virus1.pas, fg_virus2.pas (Fehér Gábor, Pascal)