Termín odoslania riešení tejto série je pondelok 10. januára 2011.
10 bodov, kategória Z
Tánička veľmi rada triedi čísla. Lenže keď nemá čo triediť, tak sa nudí, a keď
sa nudí, vyžiera ostatným KSPákom desiatu. Keďže KSPáci sú veľmi neradi hladní,
tak sa rozhodli, že ju musia nejako zabaviť. Povedali si, že jej budú podhadzovať
postupnosti. Aby to malo efekt, potrebujú, aby dané postupnosti neboli
utriedené. Bohužiaľ, nemajú čas to kontrolovať (musia si strážiť desiatu),
a preto vás žiadajú o pomoc.
Na prvom riadku vstupu je dané číslo (dĺžka postupnosti, ) a na druhom nasleduje postupnosť navzájom rôznych čísel oddelených medzerou. Napíšte program,
ktorý túto postupnosť preusporiada a vypíše na výstup tak, aby nebola rastúca ani klesajúca.
5
1 2 3 4 7
4 7 2 3 1
Vyhovuje ľubovoľné poradie okrem 1 2 3 4 7 a 7 4 3 2 1.
10 bodov, kategória Z
Tento príklad bude o Linuxe, balíčkoch a inštalovaní. Ak chceme v Linuxe
nainštalovať nejaký program, musíme nainštalovať balíček, ktorý ho
obsahuje. Avšak program potrebuje pre svoj beh napríklad knižnice. Každá
knižnica je v nejakom balíčku a preto potrebujeme mať nainštalované všetky
balíčky s knižnicami, ktoré potrebuje náš program. Tomuto hovoríme závislosť.
Ku každému balíčku v systéme poznáme zoznam balíčkov, na ktorých závisí. Tie však tiež potrebujú mať nainštalované nejaké ďalšie balíčky a tie ešte ďalšie balíčky (a takto by sme mohli pokračovať niekoľko strán).
Aby sme to nemali také ťažké, existujú rôzne pomocné programy. Povieme im zoznam balíčkov, ktoré chceme nainštalovať, a oni okrem nich nainštalujú aj všetky ostatné potrebné balíčky.
Najlepšie to demonštrujeme príkladom. Nech balíček závisí na balíčku , na a , na , na a . Ak necháme nainštalovať balíček , tak sa nainštalujú aj balíčky a , lebo na nich priamo alebo nepriamo závisí program .
Niekedy potrebujeme "naklonovať" nainštalované balíčky na druhý počítač. Môžeme si spraviť zoznam všetkých balíčkov, ktoré sú nainštalované na prvom počítači, a presne tie nainštalovať na druhý počítač. Avšak ako vidno z príkladu vyššie, stačí nainštalovať iba niektoré balíčky a zvyšné sa doplnia automaticky.
Prvý riadok vstupu obsahuje číslo -- počet balíčkov, ktoré chceme nainštalovať. Nasleduje riadkov, -ty z nich popisuje -ty balíček. Každý taký riadok začína počtom balíčkov, na ktorých závisí balíček , a pokračuje ich zoznamom. Všetky balíčky sú reprezentované celými číslami od po .
Vašou úlohou je napísať program, ktorý nájde a vypíše najmenšiu sadu balíčkov, ktorej nainštalovanie spôsobí nainštalovanie všetkých balíčkov.
Môžete predpokladať, že v závislostiach medzi balíčkami nie je cyklus a že balíčkovací systém je korektný (každý balíček závisí len na existujúcich balíčkoch). Cyklus v závislostiach je taká postupnosť balíčkov , že balíček závisí na , na , ..., na a závisí na .
5
3 2 3 4
1 4
1 4
0
1 3
1 5
Takto vyzerajú závislosti balíčkov zo vstupu:
10 bodov, kategória Z
V dobe krutej finančnej krízy sa snaží každá továreň minimalizovať svoje náklady na prevádzku,
preto sa prijímajú aj lacnejšie pracovné sily z radov dôchodcov, študentov a nelegálnych prisťahovalcov.
Inak tomu samozrejme nie je ani v továrni na triedenie čísiel. Preto keď prišla ponuka pána Michala, že
bude otročiť za jedlo, šaty a vzduch, bolo vedenie nadšené.
Rýchlo ale zistili, že to má drobný háčik. Pán Michal škúli, takže nikdy nevidí dve susedné čísla. To by ešte nebolo také hrozné, kebyže neprišiel pri absurdnej nehode s kapustou a zbíjačkou o krátkodobú pamäť. Takže príslovie ''zíde z očí, zíde z mysle'' preňho bohužiaľ platí doslovne.
Majiteľ však zistil, že keď nechá pána Michala triediť niektoré zákazky, napriek svojmu handicapu ich utriediť dokáže. Chcel by mať program, ktorý by mu pri zadaní zákazky povedal, či ju môže dať na starosť pánovi Michalovi. No a keď už je tá kríza, a vy ste študenti... môžete hádať.
Na vstupe máte dané číslo , v ďalšom riadku nasleduje celých čísiel. Vašou úlohou je rozhodnúť, či sme schopní získať z týchto čísiel neklesajúcu postupnosť, ak v jednom kroku môžeme vymeniť iba dvojicu čísel na pozíciách a ().
5
10 45 52 14 37
Ano.
Vymeníme najprv čísla na treťom a piatom mieste, potom tie na druhom a štvrtom mieste.
4
1 3 2 4
Nie.
Výmenou prvého a tretieho, ani výmenou druhého a štvrtého čísla si veľmi nepomôžeme.
Rytier Artur sa zúfalo pozerá pred seba. Ten svah, čo má pred nosom, sa mu vôbec, ale vôbec nepáči. Je strašne strmý -- keď sa na neho pokúša vyškriabať, vždy sa zošmykne späť dole. On sa ale naozaj potrebuje dostať na ten kopec. Hmm, že by to šlo nejak okolo?
Byť rytierom nie je žiadna slasť, také ťažké brnenie vám umožňuje vyškrabať sa len na svah, ktorý na jednom yarde nestúpne o viac ako stôp. Našťastie je Artur statný a vysoký a vie nejaký ten jarok aj preskočiť, pokiaľ nemá viac ako yard.
Terén si môžeme zjednodušene predstaviť ako štvorcovú sieť s riadkami a stĺpcami, kde poznáme výšku každého políčka. Artur sa vie hýbať na jeden krok/skok len v štvorci okolo seba (čiže jedným skokom vie každú svoju súradnicu zmeniť maximálne o ). Súčasne pri žiadnom kroku/skoku nemôže prekonať výškový rozdiel viac ako . Podarí sa mu nájsť cestu?
Prvý riadok vstupu obsahuje celé čísla -- výšku a šírku mapy -- a celé číslo , ktoré určuje najväčší rozdiel (či už stúpanie alebo klesanie), cez ktorý vie Artur v jednom kroku/skoku prejsť. Druhý riadok obsahuje celé čísla -- súradnice začiatočného políčka a koncového políčka . Ďalej nasleduje riadkov, v každom z nich sa nachádza celých čísel -- výška daného políčka mapy.
Pre rozmery mapy bude platiť . Ľavý horný roh mapy má súradnice a pravý dolný roh zasa . Súradnice začiatočného a koncového políčka budú vnútri mapy. Výšky políčok a rovnako aj hodnota sú z rozsahu vrátane.
Vašou úlohou je vypísať dĺžku najkratšej cesty z políčka na ,
alebo reťazec "Artur, mas smolu.
" (bez úvodzoviek), ak cesta neexistuje.
Tento príklad je praktický, čo znamená, že sa dá odovzdáva jedine elektronicky, pričom stačí odovzdať iba zdrojový kód. Pri odovzdaní sa vám program otestuje na niekoľkých vstupoch a dostane body podľa toho, na koľkých vstupoch dá správny výsledok v časovom limite.
10 10 3
1 1 10 10
2 0 0 0 0 0 0 0 0 0
0 0 0 8 0 0 0 0 0 0
0 5 0 0 0 0 0 0 0 0
0 0 0 0 0 6 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 4 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 7 0
0 0 0 0 0 0 0 0 500 2000
0 0 0 0 0 0 0 0 100 9
6
Trasa vedie po políčkach s výškami 2, 5, 8, 6, 4, 7, 9. Všimnite si, že Artur nedoskočí z políčka s výškou 5 na políčko s výškou 6, lebo je ďaleko. Zároveň si všimnite, že Artura pri skoku zaujíma iba štartovacia a koncová výška, nie výška políčok medzitým.
Dominika si pri každom nákupe v blízkom hypermarkete kúpi pár škatúľ mlieka. Potom si ich pekne uloží do poličky. Naľavo tie, ktoré treba urýchlene spotrebovať, a napravo tie, ktoré ešte nejaký čas počkajú.
Žiaľ, po poslednej oslave nič neostalo na svojom mieste a mlieka sa záhadne pomiešali. Rada by ich dostala do pôvodného stavu, no nevie ako na to, pretože na intráku je málo miesta a nemôže ich všetky naraz vybrať von.
Prvý riadok vstupu obsahuje jediné celé číslo , ktoré označuje počet škatúľ mlieka v poličke. Na druhom riadku je čísiel (každé z nich je buď alebo ) označujúcich trvanlivosť danej škatule.
Dominika môže naraz vymeniť len dve mlieka. Vypíšte takú postupnosť výmen, že po jej vykonaní budú škatule vo vzostupnom poradí podľa trvanlivosti.
Kvalita vášho algoritmu bude hodnotená podľa nasledovných kritérií (zoradené podľa dôležitosti):
3
3 3 2
1 3
4
2 3 2 1
1 4
2 4
20 bodov, kategória O
Kde bolo, tam bolo, v škole v prírode bolo raz jedno sústredenie. Toto
sústredenie však bolo špeciálne --
nachádzali sa na ňom hory jedla umiestnené na švédskych stoloch.
Švédske stoly fungujú tak, že keď k stolu príde účastník sám, naloží si množstvo jedla ekvivalentné jeho hladu. Keď však príde k stolu ďalší účastník, tak rovnako ako aj pôvodný, rozhodne nechce zaostať a priloží si navyše. Keď príde viacero účastníkov, tiež nechce nikto hladovať, každý chce ostatných tromfnúť a tak si za každého priloží.
Hora jedla je však predsa len obmedzená, z čoho vyplýva, že vedúci musia riešiť závažný problém: kto dostane jedlo?
Na vstupe je v prvom riadku počet účastníkov a množstvo dostupného jedla . Nasleduje riadkov v tvare , kde určuje množstvo jedla, ktoré skonzumuje -ty účastník a určuje množstvo jedla, ktoré -ty účastník zje navyše za každého ďalšieho účastníka pri stole. Ak teda vedúci k stolu pustia účastníkov, -ty účastník zje jedla. Napíšte program, ktorý zistí, koľko najviac ľudí sa môže najesť.
5 47
7 5
10 9
3 17
15 3
0 42
2
Vedúci môžu pustiť k stolu napríklad prvého a tretieho účastníka.
20 bodov, kategória O
Halucinka robí rada na sústredkách budíčky gitarou. Otvorí si svoj spevník a začne spievať nejakú melódiu.
Tým zobudí Hermiho, ktorý sa chce hneď pridať. Avšak polorozospatý Hermi nezačne spievať presne to, čo Halucinka,
ale svoju melódiu. Halucinka rozmýšľa, či Hermi vlastne spieva tú istú pieseň. Pomôžte Halucinke zistiť,
či Hermi spieva v inej tónine, alebo je natoľko rozospatý, že spieva inú pieseň.
Na vstupe dostanete popis dvoch melódií -- Halucinkinej a Hermiho. Každý popis začína číslom vyjadrujúcim počet tónov danej melódie, nasledujú jednotlivé tóny. Hermiho melódia je nanajvýš taká dlhá ako Halucinkina.
Halucinka aj Hermi majú rozsah 3 oktávy, dokážu preto zaspievať tieto tóny
(v poradí podľa výšky): C0
, Cis0
, D0
, Dis0
, E0
,
F0
, Fis0
, G0
, Gis0
, A0
, Ais0
, H0
,
C1
, Cis1
, D1
, ..., Ais2
, H2
, C3
.
Napíšte program, ktorý zistí, či si Hermi spieva tú istú pieseň ako Halucinka, teda či sa dá jeho melódia transponovať tak, aby vytvorila motív (čítaj podreťazec) Halucinkinej. Transponovať znamená každý tón Hermiho melódie posunúť o rovnaký počet poltónov (rovnakým smerom).
Riešenia, ktoré sa spoliehajú na generátor náhodných čísel a bez neho by dosahovali horšiu časovú zložitosť, nemajú šancu získať plný počet bodov. Pri výpočte časovej a pamäťovej zložitosti vášho algoritmu nezanedbávajte počet tónov v Halucinkinom a Hermiho rozsahu ako konštantu (aj keď vieme, že ).
24 C1 D1 E1 F1 F1 F1 F1 E1 D1 E1 E1 E1 E1 D1 C1 D1 D1 D1 D1 E1 D1 C1 C1 C1 12 H0 Ais0 Gis0 Ais0 Ais0 Ais0 Ais0 Gis0 Fis0 Gis0 Gis0 Gis0
Ano
Halucinka si spieva Kohútika jarabého a Hermi tiež, na vstupe je zachytený jeho prostriedok. Celý Hermiho Kohútik jarabí (posunutý o 6 poltónov nižšie) znie: Fis0 Gis0 Ais0 H0 H0 H0 H0 Ais0 Gis0 Ais0 Ais0 Ais0 Ais0 Gis0 Fis0 Gis0 Gis0 Gis0 Gis0 Ais0 Gis0 Fis0 Fis0 Fis0.
20
C1 D1 E1 F1 G1 F1 F1 F1 D1 C1 C1 D1 E1 F1 G1 F1 F1 F1 D1 C1
12
A1 H1 Cis2 Cis2 H1 A1 E2 E2 Fis2 E2 H1 H1
Nie
Halucinka si spieva Na zelenej lúke sedí zajac a Hermi si spieva Pod horou, pod horou.
25 bodov, kategórie O a T
Na intrákoch prednedávnom otvorili novú Novú jedáleň. Aby prežila v tvrdej
konkurencii, pripravujú v nej pomocou moderných technológií jedlo na mieru.
Najprv každý študent podstúpil síce nepríjemnú, ale zato povinnú analýzu svojich
chuťových buniek; na základe jej výsledkov mu potom priradili jedinečný pokrm.
Po prekonaní prvotnej nedôvery ale študenti zistili, že obedy na mieru sú naozaj
vynikajúce a čakať v rade na ne sa oplatí.
Všetko jedlo pripravuje automatizovaná výrobná linka, na ktorej konci stojí zamestnankyňa jedálne (študentmi nesprávne označovaná ako teta kuchárka) a vydáva obedy. Výrobná linka je však automatizovaná až príliš. Každé ráno si sama vymyslí a vytlačí zoznam jedál, ktoré v ten deň pripraví presne v poradí, v akom sa nachádzajú na zozname (jedlá na ňom sa môžu aj opakovať).
Teta kuchárka sa smutne pozerá na dnešný rad študentov, ktorí čakajú na obed. Ich poradie sa totiž podstatne líši od zoznamu jedál, ktorý na dnes vytlačila výrobná linka. No a pretože študenti odmietajú jesť obed pripravený pre niekoho iného, často stojí teta kuchárka pred dilemou: vyhodiť porciu alebo študenta?
Pomôžte tete kuchárke a nájdite postup, ktorý zaručí, že sa naobeduje čo najviac študentov.
V prvom riadku vstupu sú zadané čísla a (). Druhý riadok reprezentuje rad študentov: čísla . Tretí riadok zase obsahuje zoznam jedál, ktoré dnes pripraví výrobná linka: čísla . Platí . V rade študentov sa žiadne číslo neopakuje. Všetky čísla na riadku sú oddelené jednou medzerou.
Nájdite a na jediný riadok výstupu vypíšte najväčšie také číslo , že sa zo zoznamu jedál aj z radu študentov dá vyškrtať niekoľko vhodných čísel tak, aby nám zostali dve rovnaké postupnosti dĺžky (tí študenti, ktorí dnes dostanú svoju porciu).
Tento príklad je praktický, čo znamená, že sa dá odovzdáva jedine elektronicky, pričom stačí odovzdať iba zdrojový kód. Pri odovzdaní sa vám program otestuje na niekoľkých vstupoch a dostane body podľa toho, na koľkých vstupoch dá správny výsledok v časovom limite.
5 8
7 3 4 8 1
2 2 3 9 1 8 4 1
3
Naobedujú sa študenti 3, 4, 1 alebo 3, 8, 1.
25 bodov, kategória T
Po neúspechu s predajom slúchadiel sa Bob rozhodol, že si otvorí kníhkupectvo.
Doba je ale ťažká a tak sa rozhodol, že popri predaji legálnej literatúry si bude privyrábať aj
predajom tej ilegálnej, zaoberajúcej sa programovaním.
Čo čert nechcel, kontrola z EÚ sa rozhodla navštíviť Bobovo kníhkupectvo. Keď to zistil, mal práve v obchode párny počet ilegálnych kníh a dvoch zákazníkov, ktorí boli zaujatí týmto tovarom. Rozhodol sa, že využije túto príležitosť, zbaví sa kníh a rozdelí im ich rovným dielom. Každý zákazník si po kúpe spočíta, koľko v priemere zaplatil za jednu samohlásku (to je predsa to, čo nás v tejto literatúre zaujíma). Bob chce kvôli budovaniu dobrého mena firmy dosiahnuť, aby bol súčet týchto dvoch hodnôt čo najmenší.
Prvý riadok vstupu obsahuje párne číslo (). Druhý riadok obsahuje medzerou oddelených čísel, pričom -te číslo vyjadruje počet samohlások v -tej knihe. Tretí riadok obsahuje medzerou oddelených čísel, pričom -te z nich zasa vyjadruje cenu -tej knihy. Počty samohlások aj ceny kníh sú celé čísla z rozsahu (vrátane).
Vašou úlohou je rozdeliť tieto knihy na dve kopy tak, aby v každej kope bolo kníh a keď spočítame priemernú cenu za samohlásku v každej kope, tak súčet týchto dvoch hodnôt bude čo najmenší.
Na výstup vypíšte jedno číslo: najmenší možný dosiahnuteľný súčet priemerných cien. Vypíšte aspoň 10 desatinných miest. Vaša odpoveď by mala mať absolútnu alebo relatívnu chybu najviac .
Tento príklad je praktický, čo znamená, že sa dá odovzdáva jedine elektronicky, pričom stačí odovzdať iba zdrojový kód. Pri odovzdaní sa vám program otestuje na niekoľkých vstupoch a dostane body podľa toho, na koľkých vstupoch dá správny výsledok v časovom limite.
2
2 4
3 4
2.5
4
1 1 2 2
1 1 1 1
1.3333333333
Každému zákazníkovi Bob predá knihu s jednou a s dvoma samohláskami.
25 bodov, kategória T
Tomi a Jano sedia v lietadle. Let je dlhý a preto je jeho súčasťou aj obed.
Letecká spoločnosť pridala k obedu špeciálny bonus -- originál krevety
v plastovom tégliku. Väčšina cestujúcich si ich len nedôverčivo
obzrela, ale niektorí odvážlivci sa rozhodli vyskúšať túto novotu. Lenže chvíľu nato prišla
silná turbulencia, viaceré žalúdky spravili piruetu a patriční odvážlivci
okrevetili celé svoje široké okolie.
Právnici letovej spoločnosti zistili, že nie sú viazaní preplácať škodu všetkým -- stačí, keď ako symbolické gesto vynahradia škodu tomu, kto je na tom najhoršie, aby nevyzerali zle v novinách.
Tzv. najväčší chudák je človek, ktorého zasiahlo svojimi krevetami najviac ľudí, ale pritom si sám krevety nedal a teda za nič nemôže. Vašou úlohou je zistiť, kto to je a koľko cestujúcich ho zasiahlo (lebo od toho potom záleží, koľko mu treba zaplatiť).
Lietadlo je dlhé radov a každý rad je široký sedadiel. Na každom sedadle sedí jeden cestujúci. cestujúcich si dalo krevety a potom okrevetili svojich okolosediacich -- konkrétne štvorec so stranou , v strede ktorého sú. ( je nepárne číslo.)
Na vstupe sú prirodzené čísla , , a ; ďalej riadkov so súradnicami jednotlivých odvážlivcov (súradnice sú v poradí rad, sedadlo; čísluje sa od 1). Aspoň jeden cestujúci si krevety nedal. Váš program má vypísať jedno číslo -- koľko ľudí zasiahlo najväčšieho chudáka.
Lietadlo je interkontinentálne a teda strašne veľké. Zložitosť vášho programu nesmie závisieť od a , lebo to bude trvať večnosť a leteckú spoločnosť medzitým všetci novinári roznesú v zuboch.
6 5 3 5
2 1
4 3
6 5
2
Cestujúceho na sedadle (4, 3) síce okrevetili traja, ale keďže si sám dal krevety, nemôže to byť najväčší chudák.