Tekmovalni dnevi Instituta Jožef Stefan

Kino

Podroben opis naloge

Kinematografi, ki v nekem manjšem mestecu upravljajo s kinom, te prosijo za pomoč pri sestavljanju filmskih sporedov. Njihov kino ima eno samo dvorano in obratuje cel dan in to vse dni v letu. Leto ima 366 dni, znano pa je tudi število sedežev v dvorani; največ toliko ljudi lahko torej hkrati gleda neko predstavo.

Kinematografi si želijo, da bi prodali čimveč vstopnic, zato so nedavno izvedli med prebivalci svojega mesteca podrobno anketo. Zdaj točno poznamo število prebivalcev in za vsakega prebivalca vemo tudi to, kdaj (ob kateri uri) najraje zahaja v kino in katere žanre filmov ima rad.

Dan je tudi seznam filmov, ki jih v našem kinematografu smemo predvajati. Za vsak film je znano njegovo trajanje (v minutah), ocena priljubljenosti (ki vpliva na to, kako verjetno je, da ga bodo ljudje prišli gledat) in to, katerim žanrom pripada. Glede tega, kolikokrat (in kdaj) smemo predvajati posamezni film, ni posebnih omejitev — lahko ga predvajamo enkrat, večkrat, nobenkrat, lahko tudi večkrat v istem dnevu ipd.

Tvoja naloga je sestaviti celoletni spored predstav za ta kinematograf. Pri tem lahko uporabljaš le filme z danega seznama. Za vsako predstavo moraš navesti številko filma ter dan in uro začetka predstave. Ker ima kino eno samo dvorano, se predstave med seboj ne smejo prekrivati. Poleg tega tudi ne sme nobena predstava segati v naslednje leto (npr. če bi začeli nek film, ki traja več kot eno uro, predvajati na 366. dan ob enajstih zvečer).

Ocenjevanje pri tej nalogi poteka takole. Če tvoja oddana datoteka ne ustreza pravilom glede formata ali pa se v njej predstave prekrivajo ali segajo v naslednje leto, se šteje ta datoteka za neveljavno in ne dobi nič točk. Drugače pa bomo na tvojem celoletnem sporedu simulirali obnašanje gledalcev; za vsako predstavo se vsak gledalec z neko verjetnostjo odloči, ali bo šel kupit karto ali ne. Verjetnost nakupa je odvisna med drugim od ocene filma, od tega, ali pripada žanru, ki ga gledalec rad gleda, in od tega, ali gledalcu ustreza ura, ob kateri se film predvaja. (Podrobnosti o ocenjevanju so opisane spodaj.) Za oceno tvojega sporeda se vzame povprečno število prodanih kart v treh ponovitvah simulacije. (Pri tem si organizatorji pridržujemo pravico, da kasneje, če si bodo tekmovalci po rezultatih zelo blizu, izvedemo še dodatne simulacije, da bi tako dobili zanesljivejšo oceno posameznega razporeda.)

Simuliranje obnašanja gledalcev

Postopek simulacije, ki ga bomo uporabili za ocenjevanje oddanih sporedov, je naslednji:

Ker postopek uporablja psevdonaključna števila, ga bomo pognali večkrat in za oceno vzeli povprečno število prodanih vstopnic.

Verjetnost, da gre nek gledalec kupit vstopnico za neko predstavo, izračunamo takole:

P = Pčas · Pžanri · Pprej · Pže · Pocena

Pri tem so posamezni členi določeni takole:

Ocenjevalni program

Lahko si preneseš izvorno kodo programa, s katerim bomo izvajali simulacije in ocenjevali prejete rešitve: Rtk08Kino.cpp. (Če ga hočeš prevesti, boš potreboval še izvorno kodo postopka SFMT za generiranje psevdonaključnih števil.)

Prevedena različica ocenjevalnega programa (za Windows): 32-bitna, 64-bitna.

(Opomba: program, ki ga bomo uporabljali za ocenjevanje na našem strežniku, uporablja drugačno seme za generiranje psevdonaključnih števil kot ta tu zgoraj.)

Oblika vhodne datoteke

V prvi vrstici vhodne datoteke je niz z imenom naloge (Kino), v drugi pa številka testnega primera, na katerega se nanaša ta vhodna datoteka. V tretji vrstici je število filmov, f. To je celo število, večje ali enako 1 in manjše ali enako 22000.

Sledijo podatki o vsakem izmed f filmov. Vsak film je opisan v več vrsticah. Prva izmed teh vrstic vsebuje zaporedno številko filma (filmi so po vrsti oštevilčeni z 0, 1, … f – 1). Druga vrstica vsebuje IMDBjevo oznako filma (oblike tt + 7 števk; do IMDBjeve strani tistega filma lahko potem pridemo z URLjem oblike http://www.imdb.com/title/tt#######/). Tretja vrstica vsebuje naslov filma (tudi pobran z IMDBja). Četrta vrstica vsebuje trajanje filma v minutah; to je celo število, večje ali enako 1 in manjše od 10000. Peta vrstica vsebuje oceno (rating) filma (to je realno število, večje ali enako 0 in manjše ali enako 10). Šesta vrstica vsebuje število žanrov, ki jim ta film pripada (recimo g; to je celo število, večje ali enako 1). Sledijo podatki o vseh g žanrih, ki jim ta film pripada, in sicer sta za vsak žanr dve vrstici: prva od njiju vsebuje številko žanra (to je eno od celih števil 0, 1, …, 26), druga pa ime žanra. (Lahko si preneseš tudi spisek vseh žanrov.)

Nato sledi vrstica, ki vsebuje dve celi števili, n in s, ločeni s presledkom. Pri tem je n število vseh prebivalcev našega kraja pri tem testnem primeru (večje ali enako 1 in manjše ali enako 20000), s pa število sedežev v kino dvorani (večje ali enako 1 in manjše ali enako 500).

Sledijo podatki o vseh n prebivalcih. Za vsakega je več vrstic. Prva vrstica vsebuje čas, ob katerem je ta oseba najrajši v kinu (to je niz oblike hh:mm). Druga vrstica vsebuje število žanrov, ki jih ta oseba rada gleda (recimo g; to je celo število, večje ali enako 1). Sledi še seznam teh g žanrov, in sicer so predstavljeni enako kot pri filmih: za vsak žanr sta dve vrstici, v prvi je številka žanra, v drugi pa njegovo ime.

Opomba: IMDBjeve oznake filmov, naslovi filmov in imena žanrov so v vhodni datoteki podani le zato, da se človek lažje znajde po njej. Za potrebe sestavljanja sporeda filmov pa ti podatki niso pomembni in jih lahko vaš program tudi preskoči.

Primer: tu je primer vhodne datoteke s samo štirimi filmi, desetimi gledalci in dvorano, v kateri je prostora za pet ljudi.

Kino
0
4
0
tt0442933
Beowulf (2007)
113
6.9
4
0
Action
2
Adventure
8
Drama
10
Fantasy
1
tt0346491
Alexander (2004)
175
5.4
5
0
Action
2
Adventure
4
Biography
8
Drama
25
War
2
tt0332452
Troy (2004)
163
6.9
4
0
Action
8
Drama
12
History
19
Romance
3
tt0417148
Snakes on a Plane (2006)
105
6.5
2
0
Action
24
Thriller
10 5
23:26
3
3
Animation
4
Biography
6
Crime
11:21
2
9
Family
4
Biography
01:21
1
9
Family
00:32
1
14
Music
16:59
2
9
Family
15
Musical
14:20
2
25
War
26
Western
17:43
3
9
Family
4
Biography
7
Documentary
22:03
2
4
Biography
12
History
20:54
3
9
Family
26
Western
4
Biography
18:37
3
9
Family
4
Biography
12
History

Oblika izhodne datoteke

V prvi vrstici naj bo koda, ki si jo dobil(a) ob registraciji in iz katere je razvidno, da si rešitev res poslal(a) ti, ne pa kdo drug. V drugi vrstici naj bo ime naloge (Kino). V tretji vrstici naj bo številka testnega primera, na katerega se ta izhodna datoteka nanaša. V četrti vrstici naj bo število predstav v tvojem sporedu (recimo m; to naj bo celo število, večje ali enako 0). Sledi naj m vrstic, za vsako predstavo po ena. Vsaka od teh vrstic naj vsebuje tri cela števila, ločena s presledkom; prvo od teh števil je zaporedna številka filma (0, 1, …, f – 1), drugo je dan v letu, ko se predstava začne (0, 1, …, 365), tretje pa je čas začetka te predstave (v minutah po polnoči; to je torej eno od števil 0, 1, …, 1439).

Primer: če bi bila naša uporabniška koda enaka 123456 in bi obstajal ničti testni primer, kakršen je prikazan zgoraj, bi lahko pri njem oddali spodnjo izhodno datoteko.

123456
Kino
0
6
2 10 1200
1 30 1260
2 55 1400
3 123 555
4 366 0
2 366 1277

Vhodni podatki

Vse vhodne datoteke skupaj: kino-inputs.zip.

Za ocenjevanje štejejo rezultati pri primerih od kino01.in do kino10.in.

Registracija

Preden lahko oddajaš svoje rešitve, se prijavi prek spodnjega obrazca. Dodelili ti bomo enolično uporabniško kodo, ki jo boš potreboval(a) za pripravo svojih izhodnih datotek.

Opomba: pri tej nalogi lahko sodeluje kdorkoli, ne glede na starost, izobrazbo, itd. Objavili bomo rezultate vseh tekmovalcev, za morebitne praktične nagrade pa pridejo v poštev le tisti tekmovalci oz. tekmovalke, ki v letu 2007/08 obiskujejo kakšno srednjo šolo.

Obrazec za oddajo rešitev

(Oddaja rešitev je možna do vključno 28. marca 2008.)

Datoteka s tvojo rešitvijo:

[Nazaj na glavno stran. | Na vrh te strani. | Imate vprašanje ali komentar?]