Opgave: BOW Bowling danish BOI 0, dag. Tilgængelig hukommelse: 6 MB. 30.04.0 Byteasar er fan af både bowling og statistik. Han har nedskrevet resultaterne af et par tidligere bowling spil. Desværre er nogle af tegnene i noterne blevet slørede og dermed ulæselige. Byteasar beder dig om at skrive et program til at beregne antallet af forskellige spil, der er i overensstemmelse med hans notater. Rules of Bowling Et spil bowling består af n rammer: n simple rammer og en sidste ramme. I et typisk spil er n = 0. Ved begyndelsen af hver ramme opstilles 0 kegler i enden af en bane og hver spiller får højest to (eller tre for den sidste ramme) forsøg (skud) til at kaste en bowlingkugle ned af banen og forsøge at vælte så mange kegler som muligt. Hver ramme er nedskrevet ved hjælp af to (for en simpel ramme) eller tre (for den sidste ramme) tegn. For hvert skud får spilleren det samlede antal kegler væltet af det skud som basispoint. Spillerens basispoint i hver ramme er summen af basispointene for alle (to eller tre) skud i rammen. Hvis alle 0 kegler er væltet i en simpel ramme (og 0 basispoint dermed er optjent) får spilleren ekstra bonuspoint. For en simpel ramme er reglerne følgende: Hvis en spiller vælter alle 0 kegler i første skud i en ramme, får hun en strike og rammen slutter. Som bonuspoint får hun summen af basispointene for hendes to næste skud. En strike er nedskrevet som x-. Hvis en spiller vælter alle 0 kegler ved at bruge to skud i en ramme, får hun en spare. Som bonuspoint får hun basispointene for hendes næste skud. En spare er nedskrevet som A/, hvor A er det et-cifrede antal af kegler, der blev væltet af rammens første skud. Hvis 9 eller færre kegler blev væltet efter begge skud i en ramme, får spilleren bare basispointene for rammen og rammen er nedskrevet som AB, hvor A er antallet af kegler væltet i det første skud og B er antallet af kegler væltet i det andet skud (A + B < 0). Bemærk at bonuspoint er inkluderet i scoren for den ramme, hvor den tilsvarende strike eller spare blev lavet. Dette gælder på trods af at antallet af bonuspoint afhænger af de efterfølgende skud. For den sidste ramme er reglerne følgende: I første omgang får spilleren to skud i denne ramme. Hvis 9 eller færre kegler er væltet efter de to første skud, slutter rammen. Ellers (hvis det første skud er en strike eller de to første skud er en spare) får spilleren et ekstra skud (i alt 3). Hvis spilleren får en spare med de første to skud bliver 0 nye kegler stillet op til det tredje skud. Hvis spilleren får en strike i det første skud bliver 0 nye kegler stillet op til andet skud, og hvis andet skud er en strike bliver 0 nye kegler stillet op til det tredje skud. Scoren af den sidste ramme er det samlede antal væltede kegler (ingen bonuspoint bliver givet for strikes og spares i denne ramme). I alt er der syv mulige konfigurationer af den sidste ramme, som er beskrevet i følgende tabel (hvor A og B er et-cifrede heltal): v. 3 Bowling /3 www.boi0.mimuw.edu.pl
Betegnelse Beskrivelse Rammens score xxx tre strikes i træk 30 xxa to strikes i træk og derefter et skud der vælter A kegler 0 + A xa/ en strike og derefter en spare, hvor A kegler væltes på første skud 0 xab en strike og to følgende skud, der vælter hhv. A og B kegler (A + B < 0) 0 + A + B A/x en spare, hvor A kegler væltes i første skud, og derefter en strike 0 A/B en spare, hvor A kegler væltes i første skud, og derefter et skud der vælter B 0 + B kegler AB- to skud hvor hhv. A og B kegler væltes (A + B < 0) A + B Hvert spil er beskrevet som en sekvens af n + tegn. Efter et spil er spillet kan man udregne scoren for hver ramme. For eksempel for et spil med n = 0 beskrevet som 08x-7//x-x-344/0/x var spillerens point i hver ramme som beskrevet i det følgende: Input Ramme Betegnelse Basispoint Bonuspoint Rammens score Total 08 0 + 8 8 8 x- 0 7 + 3 0 8 3 7/ 7 + 3 40 4 / + 8 0 0 60 x- 0 0 + 8 6 x- 0 + 3 97 7 3 + 3 0 8 44 4 + 4 8 0 9 / + 9 0 0 0 sidste 0/x 0 + 0 + 0 0 40 Den første linje indeholder et heltal q ( q ), der angiver antallet af test cases. De følgende 3q linjer indeholder beskrivelser af disse test cases. Hver test cases er beskrevet af tre linjer. Den første linje i en test case beskrivelse indeholder et heltal n ( n 0), antallet af rammer. Den anden linje indeholder en sekvens af n + tegn, beskrivelsen af spillet i Byteasars noter. Slørede tegn er erstattet af?. Den tredje linje indeholder n heltal, antallet af point efter hver ramme, separeret af mellemrum. I hvert af disse tal er enten ingen af cifrene slørede, eller alle cifrene er slørede. De tal, hvor alle cifrene er slørede, er erstattet af -. Output Dit program skal udskrive q linjer, en linje per test case i samme rækkefølge som de er givet. For hvert test case skal dit program udskrive et heltal: antallet af forskellige spil der kunne svare til det givne test case. To spil er forskellige hvis og kun hvis der er et skud hvor de er forskellige, dvs. deres (n + )- tegns spilbeskrivelse er forskellige. Du kan antage at der er mindst et spil, der kunne svare til det givne test case. Det garanteres at hvert svar kan være i en signed 64-bit integer. Eksempler v. 3 Bowling /3 www.boi0.mimuw.edu.pl
0 08x-7//x?x-3??/??? 8-40 60 8 97 0 0 0 40 x-x-3?/00-37 4 9 0 Forklaring af eksempler: Betragt først det første test case. I ramme er - den eneste mulighed efter x. I ramme 8 fik spilleren 8 point samlet. Der er 9 måder hvorpå dette kan være sket: 0 + 8, + 7,..., 8 + 0. Der var ikke nogen bonuspoint i ramme 9, og derfor var der ikke nogen point i det første skud i den sidste ramme. Derefter er den eneste måde hvorpå man kan få 0 point på de sidste to skud ved en spare og en efterfølgende strike. Der er derfor 9 forskellige spil, som kunne passe sammen med første test case. I andet test case kunne der stå enhver af tegnene fra 0 til 9. Yderligere eksempel: I konkurrencesystemet er der et ekstra eksempel med flere testcases hvor n =. Bedømmelse Delopgave Betingelser (i hvert test case) Point højst seks? -tegn i input sekvensen 6 svaret er højst 0 9 7 3 intet spil, hvis beskrivelse indeholder x eller /, er i overensstemmelse med 6 Byteasars noter 4 hvert test case slutter med 00- (dvs. spilleren fik 0 point i den sidste ramme) og de 3 sidste min(3, n) tal i den tredje linje er alle - Ingen yderligere begrænsninger 8 v. 3 Bowling 3/3 www.boi0.mimuw.edu.pl
Opgave: EDI Editor danish BOI 0, dag. Tilgængelig hukommelse: MB. 30.04.0 Byteasar er programmør og arbejder på en revolutionær text editor. I editoren er der to typer operationer: editoperationer, hvor man kan ændre i teksten og fortryd-operationer, hvor man kan fortryde en forrig operation. En af de innovative funktioner i editoren er dens multilevel fortryd operation. Denne fungerer som følger: En edit-operation har level 0. En fortryd-operation har level i (for i =,,...) og fortryder den sidste operation af af level højest i, der ikke er blevet fortrudt. For eksempel kan en fortryd-operation af level kun fortryde edit-operationer, mens en fortryd-operation af level kan fortryde både edit-operationer og fortryd-operationer af level, men ikke fortryd-operationer af level eller højere. Mere formelt siger vi at hver af de udførte operationer kan være i én af to tilstande: aktiv eller fortrudt. Lad X være en af operationerne. Umiddelbart efter vi har udført operation X er denne i tilstanden aktiv. Hvis X var en fortryd-operation af level i finder vi den seneste operation af level højest i der er i tilstanden aktiv (kald denne X ) og ændrer dens tilstand til fortrudt. Hvis X også er en fortryd-operation skal vi ændre den operation, som X har fortrudt (kald denne X ) til at være aktiv igen. Hver gang tilstanden for en fortryd-operation, X j, der tidligere havde fortrudt en anden operation, X j+, ændres skal vi altså også ændre tilstanden for X j+ (hvilket kan resultere i at vi skal ændre flere tilstande). Kæden af ændringer slutter når en edit-operation er nået. For at gøre det hele mere overskueligt repræsenterer vi det nuværende indhold af editoren med et enkelt heltal s, der kaldes editor-tilstanden (og er lig 0 i begyndelsen). Hver edit-operation specificerer den editortilstand som den producerer. Editor-tilstanden er netop den tilstand specificeret af den sidste edit-operation i tilstanden aktiv (eller 0 hvis ingen edit-operation er i tilstanden aktiv). Din opgave er at skrive et program der holder styr på editor-tilstanden. Lad os se på et eksempel: Følgende tabel viser nogle operationer udført af Byteasar og editor-tilstanden efter at have udført hver af dem. Symbolet E s angiver en edit-operation, der ændrer editor-tilstanden til s, og symbolet U i angiver en fortryd-operation af level i. Operation E E E U U U 3 E 4 U U U E Editor-tilstand 0 4 0 Først udførte Byteasar tre edit-operationer. Editor-tilstanden ændredes således fra 0 til, så til, og endelig til. Derefter udførte han to fortryd-operationer af level, der fortrød operationerne E og E (altså ændrede disse operationers tilstand til fortrudt). Dette gendannede editor-tilstanden til. Den efterfølgende fortryd-operation af level 3 fortrød den forrige operation U (ændrede dens tilstand til fortrudt), hvilket gendannede operation E (satte dens tilstand til aktiv igen), hvilket ændrede editor-tilstanden til. Derefter blev E 4 udført, som satte editor-tilstanden til 4. Operationen U fortrød operation E 4, operation U fortrød den genaktiverede operation E, derefter fortrød operation U den første edit-operation, E. Til sidst blev der udført en E operation, der satte editor-tilstanden til igen. Input Den første linje af input indeholder et positivt heltal n, der angiver antallet af operationer udført af Byteasar. De næste n linjer indeholder beskrivelserne af de forskellige operationer, en pr. linje: Hver beskrivelse er et heltal a i ( n a i n, a i 0). Hvis a i > 0 svarer det til en edit-operation, der ændrer editor-tilstanden til a i. Hvis a i < 0 svarer den til en fortryd-operation af level a i. Du kan antage, at der for hver fortryd-operation vil være en operation med tilstanden aktiv af lavere level som kan fortrydes. v. 3 Editor / www.boi0.mimuw.edu.pl
Output Dit program skal producere n linjer. Den ite linje skal indeholde et heltal der er editor-tilstanden efter at have udført de første i operationer fra inputtet. Eksempler - - -3 4 - - - 4 0 Bedømmelse Delopgave Betingelser Point n 000 0 n 300 000 og alle operationer er enten E i eller U 3 n 300 000 og kun det sidste tal i output vil blive bedømt (dog skal de første 8 n tal være heltal mellem 0 og n) 4 n 300 000 37 v. 3 Editor / www.boi0.mimuw.edu.pl
Opgave: NET Network danish BOI 0, dag. Tilgængelig hukommelse: 6 MB. 30.04.0 Bytelands regering har besluttet at det er tid til at forbinde deres lille land til internettet, så indbyggerne kan deltage i programmeringskonkurrencer og se film af nuttede katte. Da netværket skulle bygges valgte de firmaet Internet Optimists Inc. til at stå for at forbinde alle de n computere i Byteland. Forbindelserne er udgjort af direkte links mellem par af computere således at enhver computer er forbundet til enhver anden computer via en sekvens af links. Byteland er ikke et rigt land på nogen måde, så for at minimere prisen er netværket struktureret i form af et træ (dvs. at der er præcis n direkte links i alt). Først alt for sent blev det indset, at denne løsning har et alvorligt problem. Hvis bare et eneste link går i stykker bliver Bytelands computere splittet så det ikke længere er muligt for alle computere at kommunikere med hinanden. For at råde bod på denne fejl er det blevet besluttet, at netværket mindst skal kunne tolerere at ét enkelt link går i stykker. Din opgave er at hjælpe Internet Optimists Inc. med at forbedre netværket på den billigste måde. Givet netværkstopologien for Byteland (dvs. hvilke n par af computere der er forbundet af direkte links) skal du finde det mindste antal af links der skal tilføjes for at netværket forbliver forbundet hvis et enkelt link ødelægges. Input Den første linje af input indeholder et positivt heltal n (n 3) (antallet af computere i Byteland). For simplicitet er alle computere nummereret fra to n. Hver af de følgende n linjer indeholder et par af heltal a og b ( a, b n, a b) der beskriver et direkte link mellem computerne a og b. Output Den første linje af output skal indeholde et heltal k, det minimale antal af links der skal tilføjes til netværket. I hver af de følgende k linjer skal dit program skrive et par af heltal a og b ( a, b n, a b) der specificerer hvilke computere der skal forbindes af et link. Linksne kan skrives i en vilkårlig rækkefølge. Hvis der er mere end én løsning må dit program skrive en vilkårlig af dem. v. 3 Network / www.boi0.mimuw.edu.pl
Eksempler 6 3 4 4 6 4 3 4 6 3 6 8 3 3 4 4 3 6 3 7 3 8 6 7 3 4 8 3 6 7 8 4 Bedømmelse Delopgave Betingelser Point n 0 8 n 000 4 3 n 00 000 37 v. 3 Network / www.boi0.mimuw.edu.pl