Problem: BOW Bowling swedish BOI 0, dag. Tillgängligt minne: 6 MB. 30.04.0 Byteasar tycker om både bowling och statistik. Han har skrivit ner resultatet från några tidigare bowlingspel. Tyvärr är några tecken i hans anteckningar suddiga, och är oläsbara. Byteasar ber dig skriva ett program som beräknar antalet distinkta spel som stämmer överens med hans anteckningar. Regler för Bowling Ett bowlingspel består av n uppställningar: n enkla uppställningar och en sista uppställning. I ett vanligt spel är n = 0. I början av varje uppställning ställs 0 käglor längst bort på banan and en spelare får som mest två (eller tre för sista uppställningen) försök (kast) att kasta ett bowlingklot längs banan för att välta så många käglor som möjligt. Varje uppställning betecknas med två (för en enkel uppställning) eller tre (för den sista uppställningen) tecken. För varje kast får spelaren en grundpoäng som ges av det totala antalet käglor som vältes med kastet. En spelares grundpoäng för en uppställning är summan av grundpoängen för alla kast under uppställningen. Om spelaren välter alla 0 kägglor i en enkel uppställning (och därmed får 0 grundpoäng) så får spelaren dessutom ytterligare bonuspoäng. För en enkel uppställning gäller följande: Om spelaren välter alla 0 kägglor med första kastet i uppställningen så får hon en strike och uppställningen avslutas. Som bonuspoäng får hon summan av grundpoängen för de två nästa kasten. En strike betecknas x-. Om spelaren välter alla 0 käglor med hjälp av båda kasten i en uppställning får hon en spärr. Som bonuspoäng får hon grundpoängen för nästa kast. En spare betecknas A/, där A är antalet kägglor som vältes med uppställningens första kast. Om spelaren har vält 9 eller färre kägglor efter båda kasten får spelaren bara grundpoängen. En sådan uppställning betecknas AB, där A är ett ensiffrigt tal som anger antalet kägglor som vältes med första kastet, och B är ett ensiffrigt tal som anger antalet kägglor som vältes med det andra kastet (A+B < 0). Notera att bonuspoäng räknas till den uppställning där bonusen (en strike eller en spare) uppnåddes, trots att den beror av kast i andra uppställningar. För den sista uppställningen gäller följande: Från början har spelaren två kast i den här uppställningen. Om 9 eller färre käglor vältes med de två kasten avslutas uppställningen. Annars (om de två första kasten är en spärr eller det första kastet är en strike) så får spelaren ett tredje kast i uppställningen. om spelaren välter alla käglor i något av de tre kasten, så ställs samtliga käglor upp igen inför nästa kast. Poängen för den sista uppställnignen är det totala antalet käglor som välts (notera att inga bonuspoäng fås för strikes eller spärrar). Sista uppställningen kan se ut på sju olika sätt och betecknas som följer (där A och B är ensiffriga tal): v. 3 Bowling /3
Beteckning Beskrivning Uppställningspoäng xxx tre strikar 30 xxa två strikar följt av ett kast som välte A käglor 0 + A xa/ en strike och en spärr där A käglor vältes med första kastet 0 xab en strike följt av två kast som välte A resp. B käglor (A+B < 0) 0 + A + B A/x en spärr där A käglor vältes med första kastet följt av en strike 0 A/B en spärr där A käglor vältes med första kastet följt av ett sista 0 + B kast som välte B käglor AB- två kast som välte A respektive B kägglor (A + B < 0) A + B Ett spel beskrivs av en sekvens av n + tecken. Efter spelets slut kan den totala poängen efter varje uppställning beräknas. Till exempel kan ett spel med n = 0 uppställningar beskrivas av 08x-7//x-x-344/0/x, där spelarens poäng efter respektve uppställningar var följande: Indata Uppställning Beteckning Grundpoäng Bonuspoäng Uppställningspoäng 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 sista 0/x 0 + 0 + 0 0 40 Första raden av indata innehåller ett heltal q ( q ), som anger antalet testfall. Därefter följer 3q rader som beskriver testfallen. Varje testfall beskrivs av tre rader av indata. Den första raden i varje testfalls beskrivning innehåller ett heltal n ( n 0), som anger antalet uppställningar. Andra raden innehåller en sekvens av n + tecken som beskriver spelet enligt Byteasars anteckningar. Suddiga tecken har ersatts av?. Tredje raden innehåller n heltal, den totala poängen efter varje uppställning, separerade av mellanslag. I varje tal är antingen alla siffror läsbara, eller så är alla siffror suddiga. Tal där alla siffror är suddiga har ersatts av -. Utdata Ditt program ska skriva ut q rader, en rad per testfall i samma ordnings som i indatan. För varje testfall ska programmet skriva ut ett heltal, antalet möjliga distinkta spel som stämmer överens med testfallet. Två spel anses olika om och endast om de skiljer sig i åtminstone ett kast, dvs sekvenserna av (n + )-tecken är olika. Du kan anta att det finns åtminstone ett spel som stämmer överens med indata. Du kan anta att svaret får plats i en 64-bit signed integer. Exempel 0 v. 3 Bowling /3
08x-7//x?x-3??/??? 8-40 60 8 97 0 0 0 40 x-x-3?/00-37 4 9 0 Förklaring av exempel: I första fallet, i uppställning efter tecknet x är - det enda möjliga tecknet. I uppställning 8 fick spelaren 8 poäng totalt. Det finns 9 olika sätt den summan kan ha uppnåtts: 0 + 8, + 7,..., 8 + 0. Uppställning 9 gav inga bonuspoäng. Därför, gav första kastet i den sista uppställningen några poäng. För att få 0 poäng med de sista två kasten är en spare följt av en strike den enda möjligheten. Det ger 9 olika korrekta spel som stämmer överens med indata. I det andra testfallet stämmer alla tecken 0 till 9 överens med indata. Ytterligare testfall: I tävlingssystemet kommer vi erbjuda ytterligare exempelindata med flera testfall där n =. Poängsättning Deluppgift Begränsningar (för varje testfall) Poäng som mest sex? i indata 6 svaret är som störst 0 9 7 3 inga spel som innehåller x eller / stämmer överens med indata 6 4 sekvensen i indata avslutas med 00- (d.v.s., spelaren fick 0 poäng i sista uppställningen) 3 och de sista min(3, n) uppställningarnas poäng givna på tredje raden i indata är - inga ytterligare krav 8 v. 3 Bowling 3/3
Problem: EDI Textredigerare swedish BOI 0, dag. Tillgängligt minne: MB. 30.04.0 Byteasar är en programmerare som arbetar på en revolutionär textredigerare. I textredigeraren finns det två sorters operationer: den ena tillåter dig att redigera text i textredigeraren, och den andra låter dig ångra tidigare utförda operationer. En av de innovativa funktionerna i textredigeraren är en flernivåångringsoperation. Den fungerar som följer. Vi säger att en textredigeringsoperation är en operation på nivå 0. En ångringsoperation på nivå i (för i =,,...) ångrar den senaste operationen som är på nivå högst i och inte är ångrad. Till exempel kan en ångringsoperation på nivå endast ångra redigeringsoperationer, och en ångringsoperation på nivå kan ångra redigeringsnivåer men också ångringsoperationer på nivå (men inte ångringsoperationer på högre nivåer). Mer formellt, varje tidigare gjord operation kan vara i ett av två tillstånd: aktiv eller ångrad. Låt X vara en av operationerna. Precis efter att operation X utförts är den aktiv. Om X är en ångringsoperation på nivå i, letar vi upp den senast gjorda operationen som är aktiv på nivå högst i (som vi betecknar X ) och ändrar tillståndet av X till ångrad. Om X också var en ångringsoperation måste vi göra operationen som X ångrade (säg, X ) till aktiv. Vi fortsätter på samma sätt: så länge tillståndet av en ångringsoperation X j som tidigare hade ångrat en operation X j+ ändras, så måste vi också ändra tillståndet av operationen X j+ (som i sin tur kan resultera i ändringen av ytterligare operationer). Hela kedjan av förändringar avslutas när en textredigeringsoperation nås. För enkelhetens skull låter vi textinnehållet i redigeraren vara ett enda heltal s som kallas för redigerarens tillstånd (detta är satt till 0 i början). Varje redigeringsoperation anger med ett heltal vilket tillstånd redigeraren ska få. Redigerarens tillstånd beror bara på den senast utförda redigeringsoperationen som är aktiv. Låt oss betrakta ett exempel: följande tabell visar några operationer som Byteasar utförde, och redigerarens tillstånd efter att ha utfört varje operation. Symbolen R s betecknar en textredigeringsoperation som ändrar redigerarens tillstånd till s, medan symbolen Å i betecknar en ångringsoperation på nivå i. Operation R R R Å Å Å 3 R 4 Å Å Å R Textredigerarens tillstånd 0 4 0 Först utför Byteasar tre redigeringsoperationer. Redigerarens tillstånd ändras från 0 till, sen till, och till slut till. Sedan utför han två ångringsoperationer på nivå, som ångrar operationerna R 3 och R (vilket ändrar deras tillstånd till ångrad). Således återställdes tillståndet till. Den följande ångringsoperationen på nivå 3 ångrade den senaste operationen Å (och ändrar dess tillstånd till ångrad), vilket i sin tur återställer operationen R till att vara aktiv. Som ett resultat blev redigerarens tillstånd återigen. Operation Å ångrar operationen R 4, operationen Å ångrar återigen den återställda operationen R, och till slut ångrar operationen Å operationen R. Indata Den första raden av indata innehåller ett positivt heltal n, antalet operationer som Byteasar utförde. De nästa n raderna innehåller beskrivningen av operationerna, one per rad. Varje rad är ett heltal a i ( n a i n, a i 0). Om a i > 0 så specifierar den en redigeringsoperation som ändrar redigerarens tillstånd till a i. Om a i < 0 så specifierar den en ångringsoperation på nivå a i. Du kan anta att för varje ångringsoperation finns det någon aktiv operation på lägre nivå att ångra. v. 3 Textredigerare /
Utdata Ditt program ska skriva ut n rader. Den i:te raden ska innehålla ett heltal, redigerarens tillstånd efter att ha utfört de första i operationerna från indata. Exempel - - -3 4 - - - 4 0 Poängsättning Deluppgift Begränsningar Poäng n 000 0 n 300 000 och det finns bara operationer R i och Å 3 n 300 000 och endast det sista talet i indata behöver vara korrekt (men de 8 första n talen måste vara heltal mellan 0 och n) 4 n 300 000 37 v. 3 Textredigerare /
Problem: NET Nätverket swedish BOI 0, dag. Tillgängligt minne: 6 MB. 30.04.0 Regeringen i Byteland har bestämt sig för att ansluta sitt lilla land till Internet, så att alla invånare kan delta i programmeringstävlingar och kolla på videos med söta katter. När det var dags att bygga nätverksstrukturen i landet gav de företaget Internet-Optimisterna Inc. uppdraget att ansluta alla Bytelands n datorer till varandra. Anslutningarna gjordes genom att vissa par av datorer fick direkta nätverksanslutningar till varandra via länkar på ett sådant sätt att varje par av datorer är anslutna via en sekvens av sådana länkar. Byteland är inte på något sätt ett rikt land, så för att minimera kostnaden byggdes nätverket i form av ett träd (d.v.s. det finns exakt n direkta länkar mellan datorerna). Alldeles för sent insåg man att denna lösning har en allvarlig brist. Om bara en enda länk i nätverket bryts så kommer nätverket att partitioneras så att vissa datorer inte kommer kunna kommunicera längre! För att förbättra nätverkets pålitlighet beslutade man att det i alla fall ska tåla att en enda länk bryts. Din uppgift är att hjälpa Internet-Optimisterna Inc. att förbättra nätverket på ett så billigt sätt som möjligt. Mer formellt, givet hur nätverket i Byteland ser ut (d.v.s. vilka n par av datorer som är anslutna via direkta länkar), bestäm det minsta antalet av nya länkar som måste läggas till så att alla datorer fortfarande är anslutna till varandra även om någon länk, vilken som helst, skulle brytas. Indata Den första raden av indata innehåller ett positivt heltal n (n 3), antalet datorer i Byteland. För enkelhetens skull är datorerna numrerade med heltal från till och med n. De följande n raderna innehåller par av heltal a och b ( a, b n, a b) som beskriver en länk mellan datorerna a och b. Utdata Den första raden av utdata ska innehålla ett heltal k, det minsta antalet länkar som måste läggas till i nätverket. På varje av de k följande raderna ska ditt program skriva ut ett par av heltal a och b ( a, b n, a b), numren på de datorer som ska anslutas med en länk. Länkarna kan skrivas ut i vilken ordning som helst. Om det finns fler än en lösning kan ditt program skriva ut vilken som helst av dessa. Exempel 6 3 4 4 6 4 3 4 6 3 6 v. 3 Nätverket /
8 3 3 4 4 3 6 3 7 3 8 6 7 3 4 8 3 6 7 8 4 Poängsättning Deluppgift Begränsningar Poäng n 0 8 n 000 4 3 n 00 000 37 v. 3 Nätverket /