Cluj-Napoca, România... CEOI 2000Vă prezentăm acum enunțurile celor șase probleme cu care s-au confruntat cei 51 de participanți la cea de-a șaptea Olimpiadă de Informatică a Europei Centrale. Problemele au fost propuse de Comitetul Științific al CEOI format din Iuliu Vasilescu, Dana Lica, Cătălin Frâncu, Mihai Stroe și Radu Lupșa. P060001: Planeta X Toți locuitorii planetei X își construiesc casele în formă triunghiulară. Pentru a economisi timp și efort, ei au o metodă de construcție specială. Totul începe cu un perete drept. Apoi, pentru a construi orice casă nouă, adaugă doar doi pereți noi la un perete deja existent, rezultând astfel o casă de formă triunghiulară. Bineînțeles, cei doi pereți nou adăugați pot fi de asemenea utilizați ca perete de pornire pentru noi case. Câteodată, utilizând acest model de construcție, apar situații în care unele case sunt complet incluse în altele (ca și în figură). Totuși, aceasta nu este o problemă, deoarece copiii pot locui în casele incluse. Pentru a-și ilumina casele, locuitorii planetei X montează câte un bec în fiecare colț al construcției finale (un bec dintr-un colț fiind comun tuturor caselor care au acel colț). În fiecare colț există un comutator, prin acționarea căruia se schimbă starea (aprins/stins) a becului din colțul respectiv, precum și a becurilor din colțurile conectate cu acesta. Două colțuri sunt considerate conectate dacă sunt plasate la extremitățile aceluiași perete.
Cerință Scrieți un program care determină o secvență de acționări ale comutatoarelor, astfel încât, pornind de la o configurație inițială dată, în final să fie aprinse toate becurile.
Intrare Numele fișierului: X.IN Linia 1: N - un număr întreg, reprezentând numărul de colțuri ale construcției, numerotate de la 1 la N; Liniile 2..2ŽN-2: I J - două numere întregi, separate printr-un spațiu, reprezentând un perete între colțurile I și J; Linia 2ŽN-1: S1 S2 ... SN - N numere întregi (separate prin spații) ale căror valori 0 sau 1 corespund stărilor celor N becuri; - 0 semnifică stins; 1 semnifică aprins. Se garantează faptul că datele de intrare reprezintă o construcție care poate fi obținută în modul specificat.
Ieșire Numele fișierului: X.OUT Linia 1: L1 L2 ... LK - K numere întregi, separate prin spații, reprezentând lista etichetelor comutatoarelor acționate. - Dacă există mai multe soluții, se cere numai una. - Dacă nu există soluție, veți afișa în fișierul de ieșire o singură linie care conține numărul 0.
Restricții - 3ŁNŁ1000
Exemplu X.IN X.OUT 6 1 6 1 3 1 4 1 5 2 3 2 4 3 4 3 6 4 5 4 6 0 1 1 1 0 0
În figura de mai jos puteți urmări pașii posibili pentru a obține construcția din fișierul exemplu; etichetele becurilor care sunt inițial aprinse sunt subliniate. P060002: Străzi Ministerul Transporturilor din România decide să îmbunătățească drumurile românești. Fiecare drum este bidirecțional și conectează direct două orașe. Între două orașe nu poate exista mai mult de un drum. Rețeaua de drumuri existentă asigură direct sau indirect legătura între oricare două orașe din România. Totuși, pentru îmbunătățirea drumurilor se închide, pe rând, fiecare drum și se execută reparațiile necesare. Pe durata acestor operații este necesar să se păstreze conectivitatea rețelei de drumuri. Pentru aceasta, Ministerul Transporturilor decide să se construiască noi drumuri, astfel încât, în orice moment, indiferent care drum este închis (în orice moment fiind închis un singur drum), traficul între oricare două orașe să fie în continuare posibil. Bineînțeles, numărul drumurilor noi adăugate trebuie să fie minim. În plus, nici un drum nou nu poate lega direct două orașe între care există deja o legătură directă.
Cerință Scrieți un program care determină numărul minim de drumuri suplimentare care trebuie construite și perechile de orașe legate de acestea. Dacă există mai multe soluții optime, se cere numai una.
Intrare Numele fișierului: ROADS.IN Linia 1: N M - Două numere întregi, separate printr-un spațiu, reprezentând numărul de orașe și respectiv numărul de drumuri. Orașele sunt etichetate de la 1 la N. Liniile 2..M+1: T1 T2 - Două numere întregi, separate printr-un spațiu, reprezentând două orașe legate printr-un drum.
Ieșire Numele fișierului: ROADS.OUT Linia 1: K - Un număr întreg, reprezentând numărul minim de drumuri suplimentare. Liniile 2..K+1: C1 C2 - Două numere întregi, separate printr-un spațiu, reprezentând o pereche de orașe care vor fi legate printr-un drum.
Observație - Ordinea perechilor de orașe din fișierul de ieșire nu contează.
Restricții - 3ŁNŁ2500 - 2ŁMŁ20000
Exemplu ROADS.IN ROADS.OUT 4 3 2 1 2 1 4 2 3 1 3 2 4 P060003: Omida Definiție: O "omidă" este un arbore cu următoarea proprietate: există un lanț central astfel încât fiecare nod al arborelui fie aparține lanțului central fie este adiacent lanțului. Figurile de mai jos ilustrează două "omizi", nodurile gri indicând lanțul.
Pot exista mai multe lanțuri. De exemplu, un alt lanț pentru "omida" din figura 2 este 3-2-5-9.
Cerințe Scrieți un program care, fiind dată o "omidă" cu N noduri, va eticheta nodurile cu numere de la 1 la N ce satisfac condițiile: - Fiecare etichetă de la 1 la N este folosită o singură dată; - Nu vor exista două muchii cu același modul al diferenței dintre etichetele nodurilor adiacente.
Mai jos este ilustrat un mod de etichetare a "omidei" din figura 2. Modulele diferențelor sunt indicate pe muchiile respective.
Figura 3 Intrare Numele fișierului: CP.IN Linia 1: N - Un întreg care indică numărul de noduri; Liniile 2..N: X Y - Două numere întregi, separate printr-un spațiu, reprezentând două noduri adiacente conectate cu o muchie.
Datele de intrare sunt corecte și arborele dat este întotdeauna o "omidă."
Ieșire Numele fișierului: CP.OUT Linia 1: L1 L2 ... LN - N numere întregi, separate prin spații, unde Li reprezintă eticheta asociată nodului i.
În cazul când există mai multe soluții, se va prezenta numai una. Dacă nu este posibilă nici o etichetare, fișierul de ieșire va conține pe unica linie cuvântul IMPOSSIBLE.
Restricții - 2ŁNŁ10000
Exemplu Fișierul de intrare (CP.IN) descrie "omida" din figura 2, iar fișierul de ieșire (CP.OUT) descrie etichetarea din figura 3.
CP.IN CP.OUT (o soluție posibilă) 9 8 1 5 2 9 4 6 3 7 1 2 6 5 5 7 4 2 2 3 8 5 2 5 5 9 P060004: Cădere Considerăm un joc bazat pe un dispozitiv ca în imaginea de mai jos:
Dispozitivul constă dintr-o mulțime de platforme orizontale de diferite lungimi, plasate la diferite înălțimi. Platforma cea mai joasă este podeaua (este plasată la înălțimea 0 și are lungime infinită). Dintr-o poziție specificată, este lăsată să cadă o minge, la momentul 0. Mingea cade cu viteză constantă de 1 metru pe secundă. Când mingea ajunge pe o platformă, începe să se rostogolească spre unul din capetele acesteia, la alegerea jucătorului, cu aceeași viteză de 1 metru pe secundă. Când mingea ajunge la capătul platformei, își continuă căderea liberă, pe verticală. Mingea nu are voie să cadă liber mai mult de MAX metri odată (între două platforme).
Cerință Scrieți un program care determină un mod de rostogolire a mingii pe platforme astfel încât să ajungă la podea cât mai repede posibil.
Intrare Numele fișierului: FALL.IN Linia 1: N X Y MAX - Patru numere întregi, separate prin câte un spațiu: numărul de platforme (excluzând podeaua), poziția de plecare a mingii (coordonatele pe orizontală și verticală), și distanța maximă pe care are voie să cadă; platformele sunt numerotate de la 1 la N. Liniile 2..N+1: X1i X2i Hi - Trei numere întregi, separate prin spații; platforma i este situată la înălțimea Hi, între coordonatele orizontale X1i și X2i inclusiv (X1i<X2i, i=1..N).
Observații - Diametrul mingii și grosimea platformelor se ignoră. Dacă mingea cade exact pe marginea unei platforme, se consideră că a căzut pe platformă. - Oricare două platforme nu au puncte comune. - Pentru datele de test există întotdeauna soluție. - Toate dimensiunile sunt exprimate în metri.
Ieșire Numele fișierului: FALL.OUT Linia 1: TIME - Un număr întreg, reprezentând timpul la care mingea atinge podeaua, conform soluției voastre. Celelalte linii, până la sfârșitul fișierului: P T D - Trei numere întregi, separate prin spații. Mingea atinge platforma P la momentul T și se îndeaptă în direcția D (0 pentru stânga și 1 pentru dreapta). - Impactul cu podeaua nu trebuie să apară în aceste linii. - Impactele cu platformele se precizează astfel încât valorile succesive ale lui T să fie în ordine crescătoare.
Observație - Dacă există mai multe soluții posibile, se cere numai una.
Restricții - 1ŁNŁ1000 - -20000ŁX1i,X2iŁ20000 (i=1..N) - 0<Hi<YŁ20000
Exemplu FALL.IN FALL.OUT 3 8 17 20 23 0 10 8 2 4 1 0 10 13 1 11 1 4 14 3 3 16 1 P060005: Bețișoare Se consideră următorul joc între doi jucători: pe o tablă sunt plasate N rânduri de bețișoare, pe rândul i fiind plasate Si bețișoare (1ŁiŁN). Bețișoarele de pe fiecare rând i sunt etichetate cu numere consecutive de la 1 la Si. Jucătorii fac câte o mutare, alternativ. Fiecare mutare constă din eliminarea a unul, două sau trei bețișoare de pe același rând. Aceste bețișoare trebuie să fie etichetate cu numere consecutive, adică să fie așezate unul după altul pe rândul respectiv. De exemplu, dacă există un rând cu zece bețișoare și primul jucător elimină bețișoarele cu etichetele 4, 5, 6, rămân numai bețișoarele 1, 2, 3, 7, 8, 9 și 10. Al doilea jucător, la rândul său, are posibilitatea de a elimina bețișoarele 1, 2, 3 dar nu și 3, 7, 8 deoarece acestea nu sunt etichetate secvențial (bineînțeles, există și alte mutări valide). Jucătorul care execută ultima mutare (adică elimină ultimul bețișor de pe tablă) este câștigătorul jocului.
Cerință Scrieți un program care să implementeze o strategie de câștig împotriva calculatorului.
Intrare Numele fișierului: STICKS.IN Linia 1: N - Un întreg, reprezentând numărul de rânduri cu bețișoare (1ŁNŁ10). Linia 2: S1 S2 ... SN - N numere întregi, separate prin spații, reprezentând numărul de bețișoare de pe fiecare rând (1ŁSiŁ10). Linia 3: X - Singurele valori posibile pentru X sunt 0 și 1. Dacă X=0, programul vostru va face prima mutare; altfel, calculatorul va muta primul.
Observație În datele de test, se garantează existența unei strategii de câștig pentru programul vostru.
Programul vostru va juca împotriva calculatorului. Interfața dintre programul vostru și calculator se realizează cu ajutorul următoarelor elemente soft: - Pascal: unit-ul STICKS - C/C++: fișierul header sticks.h Aceastea conțin următoarele subprograme:
procedure putMove(nr,label1,label2:Integer); (Pascal) void putMove(int nr,int label1,int label2); (C/C++)
Aceste subprograme se apelează pentru a anunța o mutare a programului vostru, cu semnificația "elimină de pe rândul nr bețișoarele etichetate cu numere de la label1 la label2 inclusiv" (label1Łlabel2) procedure getMove(var nr,label1, label2:Integer); (Pascal) void getMove(int *nr,int *label1,int *label2); (C/C++)
Aceste subprograme se apelează pentru a obține o mutare a adversarului, în formatul de mai sus; Programatorii în C/C++ trebuie să transmită pointeri către variabilele în care doresc să obțineți datele. Programul trebuie să apeleze alternativ cele două subprograme până când nu mai rămâne nici un bețișor pe tablă. Modulul de program al comisiei va termina jocul dacă programul concurentului va executa o mutare invalidă.
Exemplu STICKS.IN 2 1 3 1
Secvență de apeluri posibilă în Pascal: getMove(nr,k1,k2); ź nr=2, k1=2, k2=2 putMove(1,1,1); getMove(nr,k1,k2); ź nr=2, k1=1, k2=1 putMove(2,3,3); ààà programul cocurentului câștigă ààà P060006: Relief luminat Considerăm un relief compus din segmente de dreaptă unite. Deasupra reliefului sunt suspendate la aceeași înălțime N becuri. Becurile se află în poziții diferite pe orizontală. Becurile servesc pentru a lumina întregul relief. Un punct de pe relief se consideră iluminat dacă poate "vedea" un bec direct, adică segmentul care unește punctul cu becul nu contine nici un alt punct din relief.
Cerință Scrieți un program care determină numărul minim de becuri care trebuie aprinse pentru a ilumina întreg relieful.
Intrare Numele fișierului de intrare: LIGHT.IN Linia 1: M - Un întreg reprezentând numărul de specificații a înălțimilor reliefului, inclusiv primul și ultimul punct. Liniile 2..M+1: Xi Hi - Două numere întregi separate prin spații: înălțimea Hi a reliefului la poziția orizontală Xi, 1ŁiŁM; pentru 1ŁiŁM-1 are loc Xi+1>Xi; orice două puncte de relief specificate consecutiv identifică un segment de dreaptă al reliefului. Linia M+2: N T - Două numere întregi separate printr-un spațiu: numărul de becuri și înălțimea lor deasupra reliefului (altitudinea). Becurile sunt numerotate de la 1 la N. Linia M+3: B1 B2 ... BN - N numere întregi separate prin spații: coordonatele orizontale ale becurilor, Bi+1>Bi, 1ŁiŁN-1;
Ieșire Numele fișierului de ieșire: LIGHT.OUT Linia 1: K - Un întreg: numărul minim de becuri care trebuie aprinse. Linia 2: L1 L2 ... LK - K numere întregi, separate prin spații: numerele becurilor care trebuie aprinse, specificate în ordine crescătoare a coordonatelor orizontale.
Restricții - 1ŁMŁ200 - 1ŁNŁ200 - 1ŁXiŁ10000 pentru 1ŁiŁM - 1ŁTŁ10000 - 1ŁHiŁ10000 pentru 1ŁiŁM - T>Hi pentru orice 1ŁiŁM - X1ŁB1 și BNŁXM - Pentru testele date vor exista întotdeauna soluții. În cazul în care există mai multe soluții, se va prezenta numai una.
Exemplu LIGHT.IN LIGHT.OUT 6 2 1 1 1 4 3 3 4 1 7 1 8 3 11 1 4 5 1 5 6 10 [cuprins] |