Tehtävä: BOW Keilaus finnish BOI 0, päivä. Muistiraja: 6 MB. 30.04.0 Jarkka pitää sekä keilauksesta että tilastotieteestä. Hän on merkinnyt muistiin muutaman viimeisimmän keilapelin tulokset. Valitettavasti joistakin merkeistä ei kuitenkaan saa selvää. Jarkka pyytää sinua laskemaan, montako erilaista keilapeliä on voinut olla, jotka sopivat yhteen hänen muistiinpanoihinsa. Keilauksen säännöt Keilapeli muodostuu n ruudusta: n tavallista ruutua sekä viimeinen ruutu. Tavallisesti n = 0. Jokaisen ruudun alussa 0 keilaa asetetaan pystyyn radan loppuun ja pelaajalla on kaksi (tai viimeisessä ruudussa kolme) yritystä (heittoa) heittää keilapallo rataa pitkin ja yrittää kaataa mahdollisimman monta keilaa. Jokaista ruutua kuvaa kaksi (tavallisessa ruudussa) tai kolme (viimeisessä ruudussa) merkkiä. Jokaisesta heitosta pelaaja saa peruspisteinä heitolla kaadettujen keilojen yhteismäärän. Pelaajan peruspisteet kussakin ruudussa on summa kaikista ruutuun kuuluvien heittojen peruspisteistä. Jos kaikki 0 keilaa kaatuvat tavallisessa ruudussa (ja tuloksena on 0 peruspistettä), pelaaja saa vielä bonuspisteitä. Tavalliselle ruudulle säännöt ovat seuraavat: Jos pelaaja kaataa kaikki 0 keilaa ruudun ensimmäisellä heitolla, tuloksena on kaato ja ruutu päättyy. Bonuksena pelaaja saa seuraavan kahden heiton peruspisteiden summan. Kaatoa merkitään x-. Jos pelaaja kaataa kaikki 0 keilaa käyttäen ruudun molemmat heitot, tuloksena on paikko. Bonuksena pelaaja saa seuraavan heiton peruspisteet. Paikkoa merkitään A/, missä A on numero, joka vastaa kaadettujen keilojen määrää ruudun ensimmäisellä heitolla. Jos 9 tai vähemmän keiloja on kaatunut molempien heittojen jälkeen, pelaaja saa vain peruspisteet ja tällaista ruutua merkitään AB, missä A on numero, joka vastaa kaadettujen keilojen määrää ensimmäisellä heitolla, ja B on numero, joka vastaa kaadettujen keilojen määrää toisella heitolla (A + B < 0). Huomaa, että bonuspisteet lisätään sen ruudun pistemäärään, jossa kaato tai paikko saatiin, vaikka bonuspisteiden määrä riippuu tulevista heitoista seuraavissa ruuduissa. Viimeisen ruudun säännöt ovat seuraavat: Aluksi pelaaja saa kaksi heittoa ruutua varten. Jos 9 tai vähemmän keilaa on kaatunut kahden heiton jälkeen, ruutu päättyy. Muuten (jos kaksi ensimmäistä heittoa muodostavat paikon tai ensimmäinen heitto on kaato) pelaaja saa kolmannen heiton ruutuun. Aina kun pelaaja on kaatanut kaikki keilat jonkin heiton jälkeen, keilat palautetaan aloitustilanteeseen seuraavaa heittoa varten. Viimeisen ruudun pistemäärä on kaadettujen keilojen yhteismäärä (huomaa, että kaadot ja paikot eivät tuota bonuspisteitä). Viimeisen ruudun tulokseen on yhteensä seitsemän mahdollisuutta, joilla on seuraavat tulokset (A ja B tarkoittavat yhtä numeroa): Merkintä Kuvaus Ruudun pisteet xxx kolme peräkkäistä kaatoa 30 xxa kaksi peräkkäistä kaatoa ja heitto, joka kaataa A keilaa 0 + A xa/ kaato ja paikko, jonka ensimmäisellä heitolla A keilaa kaatuu 0 xab kaato, jota seuraavilla heitoilla A ja B keilaa kaatuu (A + B < 0) 0 + A + B A/x paikko, jossa A keilaa kaatuu ensimmäisellä heitolla, ja sitten kaato 0 A/B paikko, jossa A keilaa kaatuu ensimmäisellä heitolla, ja viimeinen 0 + B heitto kaataa B keilaa AB- kaksi heittoa, jotka kaatavat A ja B keilaa (A + B < 0) A + B v. 3.00 Keilaus /3 April 8 May 3, 0 www.boi0.mimuw.edu.pl
Jokainen peli kuvataan merkkijonona, jossa on n+ merkkiä. Pelin lopussa voidaan laskea pisteiden määrä kunkin ruudun jälkeen. Esimerkiksi n = 0 ruudun peli voi olla 08x-7//x-x-344/0/x, ja pelaajan pisteet kunkin ruudun jälkeen ovat Syöte Ruutu Kuvaus Peruspisteet Bonuspisteet Ruudun pisteet Yhteensä 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 viimeinen 0/x 0 + 0 + 0 0 40 Syötteen ensimmäisellä rivillä on kokonaisluku q ( q ), joka tarkoittaa testitapausten määrää. Seuraavat 3q riviä kuvaavat testitapaukset. Jokaisessa testitapauksessa on kolme riviä. Testitapauksen ensimmäisellä rivillä on kokonaisluku n ( n 0), joka tarkoittaa ruutujen määrää. Seuraavalla rivillä on n + merkin pituinen merkkijono, joka on pelin kuvaus Jarkan muistiinpanoissa. Epäselvien merkkien kohdalla on merkki?. Kolmannella rivillä on n kokonaislukua välilyönnein erotettuina, pisteiden yhteismäärä kunkin heiton jälkeen. Jokaisessa luvussa joko kaikki numerot ovat selviä tai kaikki ovat epäselviä. Jos luvun kaikki numerot ovat epäselviä, luvun tilalla on -. Tuloste Ohjelmasi tulee tulostaa q riviä, yksi rivi kutakin testitapausta kohden syötteen järjestyksessä. Jokaista testitapausta kohden ohjelmasi tulee tulostaa yksi kokonaisluku: testitapausta vastaavien erilaisten pelien yhteismäärä. Kaksi peliä ovat erilaiset tarkalleen silloin, kun ne eroavat ainakin yhden heiton osalta eli niiden n + merkin kuvaukset ovat erilaiset. Voit olettaa, että jokaista syötteen testitapausta vastaa ainakin yksi peli. Voit myös olettaa, että tulos mahtuu 64-bittiseen etumerkilliseen kokonaislukuun. Esimerkit 0 08x-7//x?x-3??/??? 8-40 60 8 97 0 0 0 40 x-x-3?/00-37 4 9 0 v. 3.00 Keilaus /3 April 8 May 3, 0 www.boi0.mimuw.edu.pl
Esimerkkien selitys: Ensimmäisessä tapauksessa ruudussa merkin x jälkeen ainoa mahdollinen merkki on -. Ruudussa 8 pelaaja sai yhteensä 8 pistettä. Niinpä on 9 mahdollisuutta, miten summa on voinut muodostua: 0 + 8, + 7,..., 8 + 0. Ruudussa 9 ei ollut bonuspisteitä. Niinpä viimeisen ruudun ensimmäinen heitto ei tuottanut pisteitä. Jotta kaksi viimeistä heittoa tuottaisivat 0 pistettä, ainoa mahdollisuus on saada paikko ja sen jälkeen kaato ruudun viimeisellä heitolla. Niinpä tätä syötettä vastaa 9 erilaista peliä. Toisessa tapauksessa mikä tahansa merkki välillä 0...9 sopii syötteeseen. Lisätestisyöte: Kilpailujärjestelmässä on lisätestisyöte, jossa on monia testitapauksia, joissa n =. Arvostelu Osatehtävä Rajat (kussakin testitapauksessa) Pisteet korkeintan kuusi? -merkkiä syötejonossa 6 tulos on korkeintaan 0 9 7 3 mikään peli, jonka kuvauksessa on merkki x tai /, ei vastaa syötettä 6 4 syötejono päättyy 00- (eli pelaaja sai 0 pistettä viimeisessä ruudussa) ja viimeiset 3 min(3, n) ruutujen pistemäärää kolmannella rivillä ovat kaikki - ei lisärajoituksia 8 v. 3.00 Keilaus 3/3 April 8 May 3, 0 www.boi0.mimuw.edu.pl
Tehtävä: EDI Editori finnish BOI 0, päivä. Muistiraja: MB. 30.04.0 Jarkka on koodari, joka käyttää vallankumouksellista tekstieditoria. Editorissa on kahdentyyppisiä operaatioita: editointioperaatio muuttaa editorissa olevaa tekstiä ja kumousoperaatio peruuttaa aiemmin tehtyjä muutoksia. Yksi editorin innovaatioista on monitasoinen kumousoperaatio. Se toimii seuraavasti. Editointioperaation taso on 0. Tason i kumousoperaatio (kun i =,,...) kumoaa viimeisen operaation, jonka taso on korkeintaan i ja jota ei ole kumottu. Esimerkiksi tason kumousoperaatio voi kumota vain editointioperaatioita ja tason kumousoperaatio voi kumota editoitioperaatiota sekä tason kumousoperaatioita (muttei korkeamman tason kumousoperaatioita). Tarkemmin sanoen jokainen suoritetuista operaatioista on joko aktiivinen tai kumottu. Olkoon X yksi operaatioista. Heti operaation X suorittamisen jälkeen sen tila on aktiivinen. Jos X on tason i kumousoperaatio, etsitään viimeisin aktiivinen operaatio, jonka taso on korkeintaan i (olkoon se X ) ja vaihdetaan operaation X tilaksi kumottu. Jos X on myös kumousoperaatio, tämän jälkeen X :n kumoaman operaation (olkoon se X ) tilaksi tulee aktiivinen. Sama prosessi jatkuu: aina kun kumousoperaation X j tila vaihtuu, täytyy myös vaihtaa operaation X j+ tila, missä X j+ on operaation X j kumoama operaatio (mistä voi edelleen seurata muiden operaatioiden tilojen muutoksia). Tilanmuutosten ketju päättyy, kun saavutetaan editointioperaatio. Yksinkertaisuuden vuoksi editorin nykyistä tekstisisältöä kuvaa yksi kokonaisluku s, jota kutsutaan editorin tilaksi (alussa tila on 0). Jokainen editointioperaatio tuottaa tietyn editorin tilan. Editorin tila riippuu siitä, mikä on viimeinen editorioperaatio, jonka tila on aktiivinen. Auta Jarkkaa kirjoittamalla ohjelma, joka pitää kirjaa editorin tilasta. Nyt on esimerkin aika: seuraava taulukko näyttää joitakin Jarkan tekemiä operaatioita ja editorin tilan kunkin operaation jälkeen. Merkintä E s tarkoittaa editointioperaatiota, joka vaihtaa editorin tilaksi s, kun taas merkintä U i tarkoittaa tason i kumousoperaatiota. Operaatio E E E U U U 3 E 4 U U U E Editorin tila 0 4 0 Ensin Jarkka suoritti kolme editointioperaatiota. Editorin tila oli ensin 0, sitten, sitten ja lopuksi. Sitten hän suoritti kaksi tason kumousoperaatiota, jotka kumosivat operaatiot E ja E (operaatioiden tilaksi tuli kumottu). Niinpä editorin tilaksi tuli. Seuraava tason 3 kumousoperaatio kumosi edellisen operaation U (sen tilaksi tuli kumottu), mikä taas palautti operaation E (sen tilaksi tuli aktiivinen). Tämän seurauksena editorin tilaksi tuli. Operaatio U kumosi operaation E 4, operaatio U kumosi jälleen palautetun operaation E, sitten operaatio U kumosi operaation E, ja viimeinen operaatio on E. Syöte Syötteen ensimmäisellä rivillä on positiivinen kokonaisluku n, joka kuvaa Jarkan suorittamien operaatioiden määrän. Seuraavat n riviä sisältävät operaatioiden kuvaukset, joista jokainen on kokonaisluku a i ( n a i n, a i 0). Jos a i > 0, niin se kuvaa editointioperaation, joka muokkaa editorin tilaksi a i. Jos a i < 0, niin se kuvaa tason a i kumousoperaation. Voit olettaa, että jokaiselle kumousoperaatiolle on jokin alemman tason operaatio, jonka tila on aktiivinen. Tuloste Ohjelmasi tulee tulostaa n riviä. Rivillä i tulee olla yksi kokonaisluku, joka kuvaa editorin tilan sen jälkeen, kun i ensimmäistä syötteen operaatiota on suoritettu. v. 3.00 Editori / April 8 May 3, 0 www.boi0.mimuw.edu.pl
Esimerkit - - -3 4 - - - 4 0 Arvostelu Osatehtävä Rajat Pisteet n 000 0 n 300 000 ja ainoat operaatiot ovat E i ja U 3 n 300 000 ja vain lukujonon viimeinen luku arvostellaan (kuitenkin ensimmäisten 8 n luvun täytyy olla kokonaislukuja väliltä 0... n) 4 n 300 000 37 v. 3.00 Editori / April 8 May 3, 0 www.boi0.mimuw.edu.pl
Tehtävä: NET Verkko finnish BOI 0, päivä. Muistiraja: 6 MB. 30.04.0 Bittimaan hallitus on päättänyt, että on aika yhdistää heidän pieni maansa Internetiin, jotta kaikki asukkaat voivat osallistua ohjelmointikisoihin sekä katsella kissavideoita. Kun oli aika rakentaa maan runkoverkko, Nettivekkuli Oy:tä pyydettiin yhdistämään kaikki Bittimaan n tietokonetta. Yhteydet tehtiin suorina linkkeinä koneparien välillä siten, että mikä tahansa konepari on yhdistetty ketjulla linkkejä. Bittimaa ei ole missään tapauksessa rikas maa, joten kustannusten minimoimiseksi verkosta tehtiin rakenteeltaan puu (eli tietokoneiden välillä on tarkalleen n suoraa linkkiä). Liian myöhään kävi ilmi, että tässä ratkaisussa on vakava ongelma. Jos yksikin linkki hajoaa, Bittimaan tietokoneet jakaantuvat niin, että jotkin koneet eivät voi olla yhteydessä toisiinsa! Bittimaan verkon luotettavuuden parantamiseksi päätettiin, että verkon tulisi sietää yksittäisen linkin hajoaminen. Tehtäväsi on auttaa Nettivekkuli Oy:tä parantamaan verkkoa mahdollisimman halvalla. Sinulle on annettu Bittimaan verkon rakenne (eli mitkä n koneparia on yhdistetty suorilla linkeillä), ja tehtäväsi on etsiä pienin mahdollinen määrä linkkejä, joiden lisäämisen jälkeen verkko on edelleen yhtenäinen, vaikka mikä tahansa yksittäinen linkki hajoaa. Syöte Syötteen ensimmäisellä rivillä on positiivinen kokonaisluku n (n 3): tietokoneiden määrä Bittimaassa. Yksinkertaisuuden vuoksi koneet on numeroitu... n. Tämän jälkeen on n riviä, joista jokaisella on luvut a ja b ( a, b n, a b): suora linkki koneiden a ja b välillä. Tuloste Ohjelmasi tulee tulostaa ensimmäiselle riville kokonaisluku k: montako linkkiä riittää lisätä verkkoon vähintään. Seuraaville k riville ohjelmasi tulee tulostaa luvut a ja b ( a, b n, a b): yhdistettävät koneet. Voit tulostaa linkit missä tahansa järjestyksessä. Jos ratkaisuja on useita, voit tulostaa minkä tahansa niistä. Esimerkit 6 3 4 4 6 4 3 4 6 3 6 v. 3.00 Verkko / April 8 May 3, 0 www.boi0.mimuw.edu.pl
8 3 3 4 4 3 6 3 7 3 8 6 7 3 4 8 3 6 7 8 4 Arvostelu Osatehtävä Rajat Pisteet n 0 8 n 000 4 3 n 00 000 37 v. 3.00 Verkko / April 8 May 3, 0 www.boi0.mimuw.edu.pl