Középiskolai Matematikai és Fizikai Lapok
Informatika rovattal
Kiadja a MATFUND Alapítvány
Már regisztráltál?
Új vendég vagy?

Az S. 78. feladat (2013. február)

S. 78. Bergengóciában a tudósok egy új növényfélét szeretnének vizsgálatoknak alávetni. Mivel a növénynek igen speciális igényei vannak, így a tudósok mindenképp egy összefüggő területen (tehát szomszédos parcellákon) szeretnék termeszteni. Ehhez rendelkezésükre áll N egymást követő parcella: 1\le N\le 5\;000\;000. Bergengóciában nagyok a szintkülönbségek az egyes parcellák között. Ismert minden parcellának a tengerszint feletti magassága: ai pozitív egész (1\le a_i\le
2\;000\;000\;000). Ráadásul a növényt csak olyan parcellákon lehet termeszteni, ahol bármely két parcella szintkülönbsége nem halad meg egy T korlátot: 0\le T\le
2\;000\;000\;000. A tudósok a növényt a rendelkezésre álló parcellák közül minél több parcellán szeretnének termeszteni. Adjuk meg a maximális elérhető parcellaszámot.

A program olvassa be a standard input első sorából N-et és T-t, majd a következő sorból az ai szóközzel elválasztott egészeket, és írja a standard output első és egyetlen sorába a maximális parcellaszámot.

Magyarázat: a 7, 10, 8, 8 magasságú parcellák megfelelőek, de akár a 10, 8, 8, 11 is helyes 4 hosszú parcellasorozat; 5 hosszú nincsen.

Pontozás és korlátok: A programhoz mellékelt, a helyes megoldás elvét tömören, de érthetően leíró dokumentáció 1 pontot ér. A programra akkor kapható meg a további 9 pont, ha bármilyen hibátlan bemenetet képes megoldani a 2,5 mp futásidőkorláton belül. Mivel a bemeneti állomány nagy, ezért érdemes beleszámolni, hogy a legnagyobb tesztesetek beolvasása önmagában 2 mp időbe telhet. Kapható részpontszám a 9 pontból, ha a program csak kisebb tesztesetekre tud lefutni időben. Az alábbi korlátok érvényesek az egyes részmegoldásokra:

\bullet 2 pontért: 0<N\le 3\;000;

\bullet további 3 pontért: 3\;000< N\le 200\;000;

\bullet további 4 pontért: 200\;000< N\le 5\;000\;000.

Beküldendő egy tömörített s78.zip állományban a program forráskódja (s78.pas, s78.cpp, ...) az .exe és más, a fordító által generált állományok nélkül, valamint a program rövid dokumentációja (s78.txt, s78.pdf, ...), amely a fentieken túl megadja, hogy a forrás mely fejlesztői környezetben fordítható.

(10 pont)

A beküldési határidő 2013. március 11-én LEJÁRT.


Megoldás

Négyzetes futásidejű megoldás: Minden kezdőparcellára megkeressük a leghosszabb parcellasorozatot, amely megfelel a feladat feltételeinek.

nlogn-es megoldás: Intervallumfával megoldható, hogy minden intervallumra meg tudjuk határozni a minimális és a maximális elemet logn időben. Ezt most nem részletezem, de bármilyen intervallumfa megoldja ezt. Ennek segítségével a következőképp oldjuk meg a feladatot. FIGYELEM, ez egy általánosan hasznos módszer: Felveszünk két változót, i-t, j-t, i=1, j=1 kezdetben. Az algoritmus egy általános lépése: ha az (i,j) intervallum megfelel a feladat feltételeinek, akkor j-i egy lehetséges megoldás, j-t növeljük; ellenkező esetben i-t. Egy ilyen ellenőtzés logn idejű, mert megkeressük a minimális és a maximális elemet, a különbségüket vesszük, utána meg könnyen eldönthető, hogy ez kisebbegyenlő, vagy nagyobb, mint a megengedett határ. Már csak azt kellene látnunk, hogy így a legnagyobb intervallumot valóban megkapjuk, az meg teljesülni fog, hiszen i előbb utóbb a legjobb intervallum kezdőpontjára áll, és akkor j-vel megkapjuk a végét.

Viszont nem ez a legjobb megoldás! Van lineáris idejű is! Erre egy mintamegoldást töltök fel, ami erősen kihasználja a double ended queue-t, azaz egy olyan sorszerű adatszerkezetet, melynek az elejére és a végére is beszúrhatunk elemet, és törölhetünk is konstans időben. Az alapötlet a következő: végigmegyünk egy index-szel 1-től n-ig, és tároljuk az összes legkisebb és legnagyobb elemet. Amíg a legeslegkisebb és a legeslegnagyobb elem közt nincs T-nél nagyobb távolság, addig jó, utána meg töröljük a sorrendben legkorábbi extrém elemet. Azért használható a double ended queue, mert mindig monoton lesz a szóba jöhető legkisebb és legnagyobb elem.

A mintamegoldás: S78.cpp


Statisztika:

5 dolgozat érkezett.
9 pontot kapott:Vályi András.
8 pontot kapott:1 versenyző.
5 pontot kapott:1 versenyző.
3 pontot kapott:1 versenyző.
0 pontot kapott:1 versenyző.

A KöMaL 2013. februári informatika feladatai