Programozás‎ > ‎Feladatok‎ > ‎Pályázatok‎ > ‎

Megoldás

Algoritmusok

A matroidos megközelítésből adódó módszer

A matroid a következő: S a munkák halmaza, a súly a munkák értéke, I pedig S azon részhalmazaiból áll, amelyekre teljesül, hogy a bennük szereplő munkák teljesíthetők. Ekkor a matroidos mohó algoritmus egyetlen nyitott problémája az, hogyan tesztelhetjük, hogy munkák egy halmaza független-e.

Ehhez a következőket érdemes észrevenni: ha vesszük azokat a munkákat, amelyek határideje legfeljebb K, akkor ilyen munkából nem lehet K-nál több, hiszen 1-től K-ig csak K nap van, és minden munkához kell teljes nap. Ami érdekesebb, hogy ez a szükséges feltétel elégséges is: ha minden K-ra legfeljebb K olyan munka van, aminek határideje legfeljebb K, akkor a munkák elvégezhetők. Ennek bizonyítása lehet például a lusta ütemezés: egy munkáról mindig csak a határidő napján döntsünk (így persze visszamenőleg is be kell ütemeznünk feladatokat, vagyis magyarosan annyit mondhatunk: "meg lehetett volna csinálni..."). A döntés pillanatában biztos hogy az 1., 2., ..,K. napok közül legalább az egyik szabad, a feltétel miatt, oda beütemezhetjük az adott munkát.

Az előző módszer gyorsítása

A függetlenség vizsgálatát helyettesíthetjük a következő ötlettel (ami egy mohó algoritmus a mohó algoritmuson belül): továbbra is a munkák ára szerinti csökkenő sorrendben haladunk. Amikor egy munkát be akarunk venni, akkor először a határideje napjára tesszük. Ha erre a napra már más munka van ütemezve, akkor keresünk egy korábbi időpontot. Ha minden korábbi nap is foglalt, akkor ezt a munkát nem választjuk be. 

Érezhető, hogy ez a módszer jó, hiszen csak akkor hagyunk ki egy K határidejű P árú munkát, ha az 1.,2., ..., K. napok mindegyikére van már munka ütemezve, ráadásul csupa P-nél nem olcsóbb munka.

Döntés a határidők csökkenő sorrendje szerint

Dobosy Kristóf ötlete: Haladjunk a lehetséges napok szerint visszafelé. Az adott napra tegyük be a legdrágább munkát, ami még nincs beütemezve, és nem késő az adott napon elvégezni.

Kódok

Uray János (C++): uj_palyazat.pas
Palincza Richárd (pascal): pr_palyazat.pas
Mezei Balázs (C#): mb_palyazat.cs
Lipták Bence (pascal): lb_palyazat.pas
Varga Erik (C++): ve_palyazat.cpp