Oppgave: BOW Bowling norwegian BOI 0, dag. Tilgjengelig minne: 6 MB. 30.04.0 Byteasar er glad i både bowling og statistikk. Han har skrevet ned resultatene sine fra noen av gangene han har spilt bowling. Desverre så har noen av tegnene han har skrevet ned blitt uklare og dermed uleselige. Byteasar ber deg om å skrive et program som kan beregne antall mulige distinkte spill som stemmer overens med notatene hans. Regler for Bowling En runde med bowling består av n ruter: n enkle ruter og en siste rute. I vanlig bowling så er n = 0. I starten av hver rute så blir 0 kjegler stillt oppreist i enden av en lang bane, og spilleren har opptill forsøk (kast) på å kaste en ball nedover banen for å velte så mange kjegler som mulig. (I noen tilfeller så vil spilleren ha 3 kast i siste rute. Se nedenfor.) Hver rute er beskrevet med (for enkle ruter) eller 3 (for den siste ruta) tegn. For hvert kast så får spilleren standardpoeng lik det totale antall kjegler han veltet på det kastet. Spillerens standardpoeng for hver rute er summen av standardpoengene for alle kast i den ruta. Dersom alle 0 kjeglene blir veltet i en enkel rute (slik at spilleren får 0 standard poeng for ruta) så vil spillenen få bonuspoeng. For en enkel rute så er reglene som følger: Dersom en spiller velter alle 0 kjeglene med sitt første kast for ruta så får han en strike og ruta avsluttes. Som bonuspoeng så får han summen av antall standardpoeng med sine neste to kast. En strike markeres med x-. Dersom en spiller bruker begge kastene sine for ruta på å velte alle 0 kjeglene, så får han en spare. Som bonuspoeng så får han standardpoengene for sitt neste kast. En spare markeres med A/, hvor A er et siffer som beskriver antall kjegler som ble veltet med det første kastet i ruta. Dersom 9 eller færre kjegler har blitt veltet etter at spilleren har gjort begge kastene sine så får spilleren bare standardpoeng og ruta markeres med AB, hvor A er antall kjegler veltet i det første kastet og B er antall kjegler veltet i det andre kastet. (A + B < 0). Merk at bonuspoengene er inkludert i poengsummen for den ruta hvor spilleren fikk enten en strike eller en spare, selv om verdien av bonusen avhenger av kast som blir gjort i senere ruter. I den siste ruta så er reglene som følger: Til å begynne med så har spilleren to kast i denne ruta. Dersom 9 eller færre kjegler blir veltet med disse to kastene så avsluttes ruta. Ellers (hvis de to første kastene er en spare eller det første kastet er en strike), får spilleren et tredje kast i ruta. Hvis spilleren velter ned alle kjeglene i ett av de tre kastene, så blir kjeglene satt tilbake til den initielle posisjonen før det neste kastet. Poengsummen for den siste ruta er det totale antall kjegler som blir veltet i den ruta (merk at det er ingen bonuspoeng for strike eller spare). Den siste ruta kan ha et av de følgende syv utfallene (hvor A og B er ensiffra tall): v. 3 Bowling /3 April 8 May 3, 0 www.boi0.mimuw.edu.pl
Markering Beskrivelse Rutepoeng xxx tre strikes etter hverandre 30 xxa to strikes, etterfulgt av et kast hvor A kjegler har blitt veltet 0 + A xa/ en strike etterfulgt av en spare, hvor A kjegler ble veltet i det første 0 kastet av sparen xab en strike etterfulgt av to kast, hvor henholdsvis A og B kjegler ble 0 + A + B veltet (A + B < 0) A/x en spare med A kjegler i første kast, etterfulgt av en strike 0 A/B en spare med A kjegler i første kast, etterfulgt av B kjegler veltet i 0 + B siste kast AB- to kast hvor henholdsvis A og B kjegler ble veltet (A + B < 0) A + B Hvert spill er beskrevet som en sekvens av n + tegn. På slutten av hvert spill så kan det totale antall poeng man fikk for hver rute beregnes. For eksempel, for et spill med n = 0 ruter beskrevet som 08x-7//x-x-344/0/x, så er spillerens poeng for hver ramme som følger: Input Ramme Markering Standardpoeng Bonuspoeng Rammepoeng Totalt 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 final 0/x 0 + 0 + 0 0 40 Første line i input inneholder et heltall q ( q ), som betegner antall testsett i fila. De påfølgende 3q linjene beskriver testsettene. Hvert testsett er beskrevet med tre linjer. Den første linja i hvert testsett inneholder heltallet n ( n 0), som betegner antall ruter. Den neste linja inneholder en sekvens med n + tegn som beskriver spillet etter Byteasars notater. Uleselige tegn er erstattet med spørsmålstegn (? ). Den tredje linja inneholder n tall, det totale antall poeng etter hver rute. For hver rute så er enten alle sifrene lesbare, eller så er alle sifrene uleselige. Tall som er uleselige er erstattet med -. Output Programmet ditt skal skrive ut q linjer, én linje per testsett i samme rekkefølge som de er gitt i input. For hvert testsett skal programmet ditt skrive ut ett heltall: det totale antall forskjellige spill som tilsvarer testsettet. To spill regnes som forskjellige hvis og bare hvis de har en forskjell i minst ett av kastene, dvs. at den (n + )-tegns beskrivelsen av spillene er forskjellige. Du kan anta at hvert testsett har minst ett korrekt spill som stemmer overens med det. Du kan anta at du får plass til resultatet i en 64-bit signed integer. Eksempler v. 3 Bowling /3 April 8 May 3, 0 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 av eksemplene: I det første eksempelet, i ramme etter x en, så må neste tegn være -. I ramme 8 så fikk spilleren 8 poeng totalt. Det er dermed 9 muligheter for hvordan han kunne oppnå denne summen: 0 + 8, + 7,..., 8 + 0. Det ble ikke gitt noen bonus poeng i ramme 9. Derfor kan det ikke ha blitt gitt noen poeng for det første kastet i den siste ruta. For å få 0 poeng i den siste ruta så må spilleren dermed ha fått først en spare etterfulgt av en strike med det siste kastet. Det er dermed 9 forskjellige gyldige spill som stemmer overens med input data. I det andre testsettet så vil alle tegn fra 0 to 9 stemme overens med input data. Ekstra eksempeltester: I konkurransesystemet kan du finne ekstra eksempeltester med flere eksempeltester med n =. Grading Subtask Begrensninger (i hvert testsett Poeng det er maksimalt seks? tegn i input sekvensen 6 svaret er maksimalt 0 9 7 3 ingen spillbeskrivelse med noen av tegnene x eller / vil stemme overens med input 6 data 4 input sekvensen slutter med 00- (dvs. spilleren fikk 0 poeng i siste rute), og de siste 3 min(3, n) rute-poengsummene gitt i den tredje linjen av testsettene vil alle være - ingen begrensninger 8 v. 3 Bowling 3/3 April 8 May 3, 0 www.boi0.mimuw.edu.pl
Oppgave: EDI Editor norwegian BOI 0, dag. Tilgjengelig minne: MB. 30.04.0 Byteasar er en programmerer som jobber med et revolusjonerende program for teksteditering. I editeringsprogrammet er det to typer operasjoner: en for å redigere tekst, og den andre for angre tidligere operasjoner. En av de innovative funskjonene til editeringsprogrammet er en flernivå angreoperasjon. Den fungerer som følgende. Vi sier at redigeringsoperasjoner har nivå 0. En angreopersjon av nivå i (for i =,,...) angrer den siste operasjonen med nivå som på det meste er i og som ikke er angret. For eksempel, en operasjon med nivå kan bare angre redigeringsoperasjoner. En angreoperasjon med nivå kan angre redigeringsoperasjoner, samt angreoperasjoner med nivå (men ikke angreoperasjoner som har høyere nivå) Mer formelt, hver av de allerede utførte operasjonene kan være i en av to forskjellige tilstander: aktiv eller angret. La X være en av operasjonene. Rett etter å ha utført operasjonen X, så er den i tilstanden aktiv. Hvis X er en angreoperasjon med nivå i, så finner vi den nyligste operasjonen som er i tilstanden aktiv og som har nivå i eller lavere (betegn den med X ) og endrer tilstanden av operasjonen X til angret. Hvis X også er en angreoperasjon, må vi endre tilstanden til aktiv på operasjonen som X hadde angret (for eksempel X ). Vi fortsetter på samme måte: når tilstanden til en angreoperasjon X j som tidligere har angret en operasjon X j+ endres, må vi også endre tilstanden til operasjonen X j+ (som selsvagt kan resultere i endret tilstand på flere operasjoner). Hele kjeden med endringer blir stoppet når en redigeringsoperasjon blir nådd. For enkelhetens skyld, det nåværende innholdet av teksten i programmet vil være betegnet med et enkelt heltall s, kalt editortilstanden (er 0 på starten). Hver redigeringsoperasjon betegner editortilstanden den produserer. Editortilstanden avhenger av den siste redigeringsoperasjonen som er i aktiv tilstand. Hjelp Byteasar ved å skrive et program som holder styr på editortilstanden. La oss se dette i aksjon: den følgende tabellen viser noen operasjoner utført av Byteasar og editortilstanden etter å utført hver av dem. Symbolet E s betegner en redigeringsoperasjon som endrer på editortilstanden til s, og symbolet U i betegner en angreoperasjon med nivå i. Operasjon E E E U U U 3 E 4 U U U E Editortilstand 0 4 0 Først utfører Byteasar tre redigeringsoperasjoner. Editortilstanden ble endret fra 0 til, så til, og til slutt til. Deretter utførte han to angreoperasjoner med nivå, som angret operasjonene E og E (endret tilstanden på de til angret). Editeringstilstanden ble dermed satt tilbake til. Den neste angreoperasjonen med nivå 3 angret den forrige operasjonen U (endret tilstanden til angret), noe som igjen førte til at operasjonen E ble gjenopprettet (endret tilstand tilbake til aktiv). Som følge av dette ble editortilstanden igjen satt til. Operasjonen U angret operasjonen E 4, operasjonen U gjorde at E ble angret igjen, den siste U operasjonen angret operasjonen E, og den siste operasjonen er E. Input Den første linjen med input innholder et positivt heltall n, antall operasjoner utført av Byteasar. De neste n linjene innholder beskrivelser av operasjonene, en per linje, hver er et heltall a i ( n a i n, a i 0). Dersom a i > 0, så betegner den en redigeringsoperasjon som endrer redigeringstilstanden til a i. Hvis a i < 0, så blir det betegnet en angreoperasjon med nivå a i. Du kan anta at for hver angreoperasjon vil det være en aktiv operasjon med lavere nivå enn angreoperasjonen. v. 3 Editor / April 8 May 3, 0 www.boi0.mimuw.edu.pl
Output Programmet ditt skal skrive ut n linjer. Den i-ende linjen skal innholde et heltall som betegner redigeringstilstanden etter å utført de første i operasjonene fra inputten. Eksempler - - -3 4 - - - 4 0 Grading Subtask Begrensninger Poeng n 000 0 n 300 000 og kun operasjonene E i og U blir brukt 3 n 300 000 og kun siste tall i sekvensen trenger å stemme (men de første n 8 tallene må være heltall fra 0 til n) 4 n 300 000 37 v. 3 Editor / April 8 May 3, 0 www.boi0.mimuw.edu.pl
Oppgave: NET Network norwegian BOI 0, dag. Tilgjengelig minne: 6 MB. 30.04.0 Myndighetene i Byteland har bestemt at det er på tide å koble landet til Internett, slik at alle innbyggerne kan delta i programmeringkonkurranser og se på søte kattevideoer. Da de skulle bygge stamnettet i landet, ga de oppgaven med å koble sammen alle n datamaskinene i Byteland til firmaet Internett Optimistene Inc. Koblingene ble laget mellom par av datamaskiner på en slik måte at alle datamaskiner er koblet sammen med en sekvens av koblinger. Byteland er på ingen måter et rikt land. For å minimere kostnadene, så ble nettverket bygget med en trestruktur (det er altså nøyaktig n direkte koblinger mellom datamaskinene). Altfor sent innså man at dette medførte en stor ulempe. Hvis en av koblingene blir ødelagt, så vil nettverket bli delt og noen av datamaskinene vil ikke kunne kommunisere med hverandre. For å øke feiltoleransen til nettverket, så er det blitt bestemt at nettverket i hvertfall skal kunnne tolerere at én kobling kan bli ødelagt. Din oppgave er hjelpe Internett Optimistene Inc. med å forbedre nettverket på billigst mulig måte. Gitt nettverksstrukturen til Byteland (altså hvilke n par med datamaskiner som er koblet direkte sammen), finn det minste tallet med koblinger som man trenger å legge til slik at nettverket fortsatt er sammenkoblet dersom en av koblingene blir ødelagt. Input Den første linjen med input er et positiv heltall n (n 3), antallet datamaskiner i Byteland. For enkelhetens skyld er alle datamaskinene nummerert fra til n. Hver av de påfølgende n linjene innholder et par med heltall, a og b ( a, b n, a b) som betegner hvilke datamaskiner som er koblet direkte sammen. Output I den første linjen med output skal programmet ditt skrive et heltall k, det minste antallet med koblinger som må legges til nettverket. I de hver av de påfølgende k linjene skal programmet ditt skrive et par med heltall, a og b ( a, b n, a b) som betegner tallene til datamaskinene som skal kobles sammen. Koblingene kan skrives i hvilken som helst rekkefølge. Hvis det er mer enn en løsning, så kan programmet ditt skrive ut hvilken som helst av de. v. 3 Network / April 8 May 3, 0 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 Grading Subtask Begrensninger Poeng n 0 8 n 000 4 3 n 00 000 37 v. 3 Network / April 8 May 3, 0 www.boi0.mimuw.edu.pl