ZENIT v programovaní
školský rok 2000/2002, ročník XVIII.

Tak pre tých zvedavejších tu mám aj celé zadanie XVIII. ročníka ZENITU v programovaní.

Síce som trošku to originálne zadanie skrátil, lebo určite každý vie, že zadanie je treba programovať v Turbo Pascale alebo C++.

Tak si môžete trápiť hlavičky a skúšať programovať. Určite to nebude pre Vás na škodu a veľa sa tým naučíte. Držím Vám palce!

Návrat na úvodnú stránku ZENITU.


Všeobecné pokyny:
Ak si chcete svoje programy otestovať testovacím programom, mali by ste dodržať aj tieto základné pokyny.
Úlohu riešte v jazyku Pascal (dialekt Turbo Pascal v.7.0 alebo kompatibilný) alebo C (dialekt Turbo C++ v. 3.0 alebo kompatibilný). Zdrojový text vášho riešenia uložte do súboru NEMOCNI.PAS resp. NEMOCNI.CPP (celé riešenie musí byt uložené v tomto súbore). Môžete použiť štandardné knižnice uvedených dialektov.
Váš program bude čítať vstupné údaje z textového súboru NEMOCNI.IN a vypisovať riešenia na obrazovku počítača vo formáte presne stanovenom zadaním úlohy. Môžete predpokladať, že vstupné údaje zodpovedajú popisu v zadaní. Riešenie píšte bielou farbou na obrazovku v štandardnom textovom móde, pred začatím vlastnej činnosti programu nezabudnite zmazať obrazovku, nevypisujte na obrazovku žiadne iné informácie okrem tých, ktoré sú požadované zadaním.

Zadanie :
Na okraji mesta stojí nemocnica. Na prízemí sa nachádza lekáreň. Okrem toho má nemocnica k poschodí (očíslovaných číslami 1,2 ... k), pričom na každom z poschodí sa nachádza jedna alebo viacero ordinácií. Do nemocnice v rôznych časoch dňa prichádzajú pacienti, pričom každý z nich potrebuje navštíviť buď lekáreň, alebo jednu či viacero ordinácií.

Pacienti navštevujúci lekáreň sa po vstupe do budovy dostanú k vchodu do lekárne za 10 sekúnd. Tam buď pristúpia priamo k okienku (ak v lekárni nikto nie je), alebo sa postavia do radu. Lekárničke trvá vydanie jedného liečiva 20 sekúnd a ďalej za každého pacienta potrebuje ďalšiu minútu (platenie, tlač potvrdenky, atď...). Po vybavení svojej žiadosti každá pacient opustí lekáreň, za 10 sekúnd príde k vchodu nemocnice a odchádza.
Pacient, ktorý ide do ordinácií, najprv vyjde po schodoch na poschodie, na ktorom je prvá ordinácia, ktorú potrebuje navštíviť. Tam čaká v čakárni, kým nepríde na rad, potom vojde do ordinácie a strávi tam určitý čas. Potom ide k ďalšej ordinácií, až kým neabsolvuje všetky potrebné vyšetrenia, pričom po poslednom zíde na prízemie a odchádza z budovy. Ak viacerí pacienti prídu naraz k tej istej ordinácií, zaraďujú sa do radu podľa času svojho príchodu do budovy.
Medzi jednotlivými poschodiami sa dá prechádzať po schodoch. Od vchodu do budovy k začiatku schodov (alebo naopak) trvá cesta 10 sekúnd. Takisto 10 sekúnd trvá cesta medzi dvoma ordináciami na tom istom poschodí a cesta z ordinácie ku schodom a naopak. Po schodoch trvá vyjdenie jedného poschodia 20 sekúnd a zídenie 15 sekúnd.
Vstupný súbor obsahuje údaje o prichádzajúcich pacientoch počas jedného dňa a ďalšie údaje popísané v podúlohách. Na prvom riadku je číslo n udávajúce počet pacientov, ktorí v ten deň nemocnicu navštívili (1=<n=<1000). Na každom z n ďalších riadkov je opis jedného pacienta. Riadok začína písmenom "L", ak pacient ide do lekárne, písmenom "O", ak chce ísť do ordinácií. Za týmto písmenom je medzera a štyri celé čísla h, m, s, p. Kde h je hodina, m minúta, s sekunda, pričom sekundy sú vždy násobky piatich. Číslo p udáva pre pacientov, ktorí idú do lekárne počet liečiv, ktoré si chcú vyzdvihnúť, u ostatných pacientov počet vyšetrení, ktoré potrebuje absolvovať. Pre pacientov idúcich do ordinácií riadok ďalej obsahuje zoznam vyšetrení p trojíc celých čisel a, b, c. Kde a je poschodie, na ktorom je oddelenie, b je číslo dverí v rámci poschodia a c je čas, ktorý vyšetrenie trvá v minútach, 1=<a=<20 , 1=<b=<999, 1=<c=<120. Pacient vždy absolvuje vyšetrenia v uvedenom poradí a žiaden pacient nepotrebuje navštíviť tú istú ordináciu dvakrát bez toho, aby medzi tým navštívil nejakú inú ordináciu. Čísla v každm riadku sú vždy oddelené medzerou. Žiadni dvaja pacienti neprídu do budovy naraz a pacienti sú vo vstupnom súbore usporiadaní podľa času ich príchodu.
Môžete predpokladať, že počet ordinácií v nemocnici je najviac 32. Každý pacient (okrem tých, čo idú do lekárne) absolvuje najmenej jedno a najviac desať vyšetrení. Pacient idúci do lekárne si vyzdvihne aspoň jeden liek. Navyše každý z pacientov príde do budovy najskôr o 7:00 hodine a najneskôr o 16:00. Všetky vyšetrenia aj výdaj liekov sa podarí ukončiť pred 17:00.

Úlohy :
a. Do riadku 2 od pozície 2 vypíšte text ”Lekaren:”. Do riadku 3 od pozície 2 vypíšte text ”Pacientov:”. Do toho istého riadku od pozície 13 počet pacientov, ktorí chcú navštíviť lekáreň. Do riadku 4 od pozície 2 vypíšte text ”Lieciv:” a od pozície 10 vypíšte počet liečiv, ktoré lekáreň za celý deň vydá.

b. Do riadku 3 od pozície 20 vypíšte celkový čas od príchodu prvého pacienta do lekárne po odchod posledného pacienta z lekárne v tvare ”H:MM:SS”, kde H, MM, SS je počet hodín, minút a sekúnd. Do MM a SS doplňte na miesto desiatok pre jednociferné počty nulu. Ak žiaden pacient v lekárni nebol, vypíšte ”0:00:00”.

c. Raz, keď riaditeľ videl dlhý rad pred lekárňou, napadlo ho pridať do lekárne ešte nejaké okienka na výdaj liekov. Rád by vedel, aký minimálny počet okienok by bolo treba pridať, aby v deň, ktorý je popísaný vo vstupnom súbore, nikto nečakal, kým príde na rad, viac ako 10 minút. Ľudia by naďalej stáli v jednom rade, ale zakaždým, keď by sa uvoľnilo nejaké okienko, pristúpil by k nemu prvý v rade. Čas presunu k okienku je zanedbateľný. Do riadku 5 od pozície 2 vypíšte text ”Novych okienok:” a od pozície 18 ich počet.

d. Vypíšte zoznam všetkých ordinácií. Môžete predpokladať, že každú navštívil v ten deň aspoň jeden pacient. Do riadku 7 od pozície 2 vypíšte text ”Ordinacie:”. Ordinácie vypíšte do dvoch stĺpcov, ktorým budú prislúchať pozície 1–40 a 41–80 na obrazovke. Stĺpce začínajú riadkom 8 a končia riadkom 23. Ordinácie vypisujte do osobitných riadkov najskôr do prvého, potom do druhého stĺpca, pričom ordinácie usporiadate podľa poschodia a ordinácie na jednom poschodí usporiadate podľa čísla dverí. Pre každú ordináciu vypíšte od pozície 2 (resp. 42) poschodie, na ktorom sa nachádza, zarovnané doprava na dve miesta. Od pozície 5 (resp. 45) vypíšte číslo dverí zarovnané doprava na tri miesta. Od pozície 9 (resp. 49) vypíšte počet vyšetrení vykonaných v ordinácii zarovnaný doprava na 3 miesta.

e. Riaditeľ by zo zaznamenaných údajov chcel zistiť, ako bola ktorá ordinácia vyťažená. Pre každú ordináciu vypočítajte, koľko času uplynulo medzi príchodom prvého pacienta a odchodom posledného. Tento čas vypíšte na pozíciu 13 (resp. 53) v tvare ”H:MM:SS”.

f. Lekárnička Anežka nechala svoju malú dcérku Aničku chvíľu samotnú v sklade. Anička povyberala z políc hromadu krabičiek od liekov a zoradila ich vedľa seba na podlahu od najmenšej po najväčšiu. Krabičky si všimli blšky Blha a Mlha a začali po nich poskakovať. Aničku zaujíma, koľko skokov blšky potrebujú, aby preskákali po krabičkách. Vo vstupnom súbore sa za popisom pacientov na ďalšom riadku nachádzajú čísla m, p1 a p2 (1=<m=<500, 1=<p1, p2=<1000 ), kde m je počet krabičiek a p1 (resp. p2) maximálna výška v mm, ktorú dokáže blška Blha (resp. Mlha) prekonať jedným skokom. Blšky vedia preskočiť ľubovolný počet škatuliek, pokiať rozdiel ich výšok neprekračuje zadanú hodnotu. Na ďalšom riadku nasleduje m čísel udávajúcich výšky krabiciek v mm usporiadané od najmenšej po najväčšiu. Žiadna krabička nie je vyššia ako 1000mm. Do riadku 2 (resp. 3) od pozície 40 vypíšte text ”Blha:” (resp ”Mlha:”). Do príslušného riadku od pozície 46 vypíšte najmenší počet skokov, ktoré blšky potrebujú, aby sa dostali zo zeme (výška 0mm) na najvyššiu krabičku. Môžete predpokladať, že to obe blšky dokážu.

g. Blškám sa hra zapáčila a mierne si ju upravili. Dohodli sa, že ak na niektorú krabičku (okrem poslednej) jedna z nich skočí, tak na ňu už nemôže skočiť druhá. Do riadku 4 od pozície 40 vypíšte text ”Spolu to dokazu.”, ak môžu za takýchto podmienok popreskakovať zo zeme až na najvyššiu krabičku. V opačnom prípade vypíšte text ”Spolu to nedokazu.”.

h. Keď sa už blšky Blha a Mlha dohrali a odskákali spinkať, priskákala ku krabičkám rodinka bĺch Žlh. Blchy Žlhy už dlhšie s údivom sledovali, ako sa hrajú Blha a Mlha a najviac sa im páčila ich posledná hra. Blch Žlh je však veľmi (povráva sa, že dokonca nespočítateľne) veľa, ale zato všetky vedia skákať rovnako vysoko. Bolo im jasné, že za týchto podmienok sa hore nedostanú všetky, ale aj tak by ich zaujímalo, koľko najviac ich môže na najvyššiu krabičku doskákať. Na ďalšom riadku vstupného súboru sa nachádza jediné celé číslo p3 (1=<p3=<1000) – maximálna výška v mm, ktorú dokážu blchy Žlhy prekonať jedným skokom. Do riadku 5 od pozície 40 vypíšte text ”Blch Zlh:” Do príslušného riadku od pozície 50 vypíšte najväčší počet blch Žlh taký, že vedia všetky vyskákať zo zeme na najvyššiu krabičku tak, aby na každú zo zvyšných krabičiek skočila najviac jedna blcha Žlha.

Pre overenie a lepšie pochopenie si môžete pozrieť príklad vstupu a výstupu.