www.agora.ro

Încercați-vă puterile!

PROBLEME propuse pentru REZOLVARE

Olimpiada de Informatică a Europei Centrale a fost organizată anul acesta în orașul Brno, în Cehia. Vă propunem să încercați să rezolvați problemele cu care s-au confruntat concurenții la această competiție.

P010001: Livrări

Șeful unui magazin sortează toate tipurile de produse în ordine alfabetică, pe baza etichetelor lor.

Toate produsele ale căror etichete încep cu aceeași literă sunt așezate în același depozit ce va fi etichetat cu această literă.

Pe parcursul unei zile, șeful primește și înregistrează comenzi de produse care vor fi livrate din depozite. Fiecare cerere de livrare se referă la un singur tip de produse. Șeful efectuează livrările în ordinea înregistrării lor.

Se cunosc cererile de livrare care urmează a fi satisfăcute într-o zi, dar nu se cunoaște ordinea în care au fost înregistrate.

Determinați toate modalitățile posibile de vizitare a depozitelor în scopul de a aduna toate produsele solicitate unul câte unul.

Date de intrare

Fișierul de intrare ORDERS.IN conține o singură linie pe care sunt scrise toate etichetele produselor solicitate (ordinea etichetelor este oarecare).

Fiecare produs este reprezentat prin prima literă a etichetei. Sunt folosite doar literele mici ale alfabetului latin.

Numărul livrărilor nu va fi mai mare decât 200.

Date de ieșire

Fișierul de ieșire ORDERS.OUT va conține toate modalitățile posibile de vizitare a depozitelor:

  • Fiecare depozit este reprezentat printr-o literă a alfabetului latin - prima literă a etichetelor din acel depozit
  • Fiecare succesiune de vizite se va scrie în fișierul de ieșire o singură dată, pe câte o linie.
  • Acestea vor fi scrise în fișier în ordine alfabetică (vezi exemplul).
  • Nu există fișiere de ieșire cu dimensiuni mai mari decât 2MB.

Exemplu

ORDERS.IN ORDERS.OUT

bbjd bbdj

bbjd

bdbj

bdjb

bjbd

bfdb

dbbj

dbjb

djbb

jbbd

jbdb

jdbb

P010002: Numere de telefon

Deoarece numerele de telefon sunt formate frecvent din foarte multe cifre, în scopul de a le memora mai ușor, se asociază litere la cifre, ca în figură. În acest fel fiecare cuvânt sau grup de cuvinte poate fi asociat unui singur număr de telefon. De exemplu, numărului de telefon 941837296 i se asociază cuvântul WHITEPAWN, iar numărului de telefon 2855304 i se va asocia cuvântul BULLDOG.

Scrieți un program care determină o secvență formată dintr-un număr minim de cuvinte care corespunde numărului de telefon dat și este formată folosind cuvinte dintr-o listă dată. Corespondența dintre cifre și litere se găsește în figură.

Date de intrare

Prima linie a fișierului PHONE.IN conține numărul de telefon a cărui codificare se caută. Numărul poate fi format din cel mult 100 de cifre. Cea de-a doua linie conține numărul cuvintelor din dicționar (maxim 50000 de cuvinte). Restul liniilor conțin câte un cuvânt format din cel mult 50 de litere mici ale alfabetului latin. Dimensiunea maximă a fișierului de intrare nu depășește 300KB.

Date de ieșire

Singura linie a fișierului de ieșire PHONE.OUT va conține secvența formată din numărul minim de cuvinte determinată de program.

  • Cuvintele vor fi separate printr-un singur spațiu.
  • Dacă pentru un anumit conținut al fișierului de intrare problema nu are soluție, în fișierul de ieșire se va scrie ‘No solution.'.
  • Dacă pentru un anumit conținut al fișierului de intrare, problema are mai multe soluții, având același număr minim de cuvinte, în fișierul de ieșire se va scrie una singură.

Exemple

PHONE.IN PHONE.OUT

7325189087 reality our

5

it

your

reality

real

our

Secvența real it your are un număr mai mare de cuvinte.

Pentru numărul 4294967296 singurul conținut corect al fișierului de ieșire este: No solution deoarece nici un cuvânt dat nu conține litera g, respectiv h, necesare codificării cifrei 4.

P010003: Joc de paritate

Tu și prietenul tău jucați următorul joc. Prietenul tău se gândește la un șir de cifre 0 și 1 pe care îl reține. Tu poți alege o secvență de poziții consecutive (de exemplu, începând cu cea de-a treia cifră până la a cincea inclusiv) și îl poți întreba dacă această parte din șirul ales conține un număr par sau un număr impar de cifre 1. Pritenul îți răspunde la întrebare și tu poți pune altă întrebare pentru o altă secvență.

În fond, ar trebui să afli șirul la care s-a gândit prietenul tău.

Deoarece îl suspectezi pe prietenul tău că nu toate răspunsurile sale sunt corecte, ai dori să-i dovedești că minte. În această situație trebuie să scrii un program care să te ajute în acest scop.

Programul va primi o serie de întrebări de ale tale împreună cu răspunsurile primite. Sarcina programului este de a afla primul răspuns care rezultă a fi greșit, adică există un șir de cifre de 1 și 0 pentru care toate răspunsurile precedente sunt adevărate, dar răspunsul curent este fals, altfel spus, nu există nici o secvență pentru care să fie corect și acest răspuns.

Date de intrare

Prima linie a fișierului PARITY.IN conține un singur număr, reprezentând lungimea șirului de 0 și 1. Această lungime este mai mică sau egală cu 1000000000. Pe cea de-a doua linie se află un număr întreg pozitiv care reprezintă numărul de întrebări și răspunsuri. Numărul întrebărilor ce au alăturate răspunsurile este mai mic sau egal cu 5000. Restul liniilor din fișier conțin întrebările și răspunsurile. Fiecare linie conține o singură întrebare și răspunsul aferent: două numere naturale (prima și ultima poziție a secvenței din șirul de cifre ales) și un cuvânt care este fie ‘even', fie ‘odd' (cuvânt care se referă la paritatea numărului de cifre de 1 în secvența aleasă, par, respectiv impar).

Date de ieșire

Fișierul de ieșire PARITY.OUT conține o singură linie pe care se va scrie un singur număr întreg X. Acest număr semnifică faptul că există un șir de 1 și 0 care satisfac primele X condiții de paritate - răspunsuri -, dar nu satisfac primele X+1 condiții.

Dacă toate răspunsurile se dovedesc a fi corecte, adică există cel puțin un șir de 1 și 0 care satisface toate condițiile date, numărul X va fi egal cu numărul de întrebări din fișier.

Exemple

PARITY.IN PARITY.OUT

10 3

5

1 2 even

3 4 odd

5 6 even

1 6 even

7 10 odd

PARITY.IN PARITY.OUT

10 5

5

1 2 even

1 4 even

2 4 odd

1 10 even

3 10 even

P010004: Vizita orașului

O agenție de voiaj dorește să ofere solicitanților un traseu de vizitare a orașului. Deoarece sunt și alte programe distractive de realizat, agenția a luat o decizie nașpa și anume se caută cel mai scurt traseu care începe și se termină în același loc. Programul vostru trebuie să determine un astfel de traseu.

În oraș există N noduri numerotate de la 1 la N și M muchii numerotate de la 1 la M. Două noduri pot fi legate prin una sau mai multe muchii; aceste muchii corespund străzilor din oraș și toate sunt cu circulație în ambele sensuri. Nu există muchie de la un nod la el însuși. Fiecare traseu este format dintr-o secvență de muchii y1,...,yk, k>2. Muchia yi(1ŁiŁk-1) leagă nodurile xi și xi+1, muchia yk leagă nodurile xi și xi+1. Toate nodurile de pe traseu trebuie să fie distincte. Lungimea traseului este suma tuturor muchiilor de pe traseu: L(y1)+L(y2)+...+L(yk) unde L(yi) este lungimea muchiei yi(1ŁiŁk).

Programul vostru trebuie să determine un traseu de lungime minimă care pleacă dintr-un nod, se întoarce în acest nod și nu trece neapărat prin toate nodurile. În cazul în care nu este posibilă determinarea, se va afișa mesajul ‘No solution'.

Date de intrare

- Prima linie a fișierului de intrare TRIP.IN conține două numere pozitive întregi: numărul nodurilor NŁ100 și numărul muchiilor MŁ10000.

- Pe fiecare dintre următoarele linii este specificată câte o muchie prin trei numere pozitive: cele două noduri de la capetele muchiei și lungimea asociată acesteia (număr pozitiv întreg mai mic decât 500).

Date de ieșire

- Fișierul de ieșire TRIP.OUT conține o singură linie.

- Dacă problema nu are soluție, conținutul va fi mesajul ‘No solution.'.

- Dacă există traseu care respectă cerințele problemei, în fișier se va scrie secvența nodurilor de pe traseu în ordinea de parcurgere a traseului (numerele x1,...,xk din enunț), separate printr-un singur spațiu.

- Dacă există mai multe soluții, în fișier se va afișa una singură.

Exemple

TRIP.IN TRIP.OUT (o soluție posibilă)

5 7 1 3 5 2

1 4 1

1 3 300

3 1 10

1 2 16

2 3 100

2 5 15

5 3 20

TRIP.IN TRIP.OUT (singura soluție corectă)

4 3 No solution.

1 2 10

1 3 20

1 4 30

P010005 Pe tabla de șah

Pe o tablă de șah, având dimensiunea 4Ž4 există 8 piese albe și 8 piese negre, adică o piesă pe fiecare pătrățel. O asemenea configurație de piese se numește o stare a jocului. Două piese sunt vecine dacă sunt plasate pe pătrățele având o latură comună (adică sunt vecine pe orizontală sau pe verticală, dar nu pe diagonală). Rezultă că fiecare piesă poate avea cel mult patru vecini. Singura mutare permisă este interschimbarea a două piese vecine. Programul trebuie să determine succesiunea cea mai scurtă de mutări care transformă starea inițială a jocului în starea finală. Ambele stări se dau.

Date de intrare

Starea inițială a jocului este descrisă în primele linii ale fișierului GAME.IN. Pe fiecare linie sunt scrise 4 caractere, care precizează culoarea fiecărei piese aferente liniilor de pe tablă de sus în jos, respectiv de la stânga la dreapta. Caracterul ‘0' reprezintă o piesă albă, iar caracterul ‘1' corespunde unei piese negre. Între caracterele care descriu piesele de pe o linie a tablei nu există separatori. A cincea linie este vidă. Pe următoarele 4 linii se descrie starea finală a jocului în același mod.

Date de ieșire

Prima linie a fișierului de ieșire GAME.OUT va conține numărul minim de mutări.

Următoarele linii trebuie să conțină descrierea mutărilor în ordinea efectuării lor. O linie descrie o singură mutare și conține patru numere întregi pozitive, separate printr-un singur spațiu în următorul format: R1 C1 R2 C2.

Acestea reprezintă coordonatele pieselor vecine, interschimbate pe parcursul jocului. [R1 C1] respectiv [R2 C2] reprezintă pătrățele pe care sunt situate piesele interschimbate. R1 sau R2 reprezintă numărul de ordine al liniei, iar C1, respectiv C2 reprezintă numărul de ordine al coloanei. Liniile tablei sunt numerotate începând cu 1 (cea mai din stânga coloană) până la patru (cea mai din dreapta). Coordonatele colțului stânga sus sunt [1 1].

Dacă există mai multe soluții cu același număr minim de mutări, se va afișa una singură.

Exemplu

GAME.IN GAME.OUT (o soluție posibilă)

1111 4

0000 1 2 2 2

1110 1 4 2 4

0010 3 2 4 2

4 3 4 4

1010

0101

1010

0101

P000106 Jocul de-a constructorul

Johny dorește să construiască un orășel mare din cuburile sale. La baza orășelului are o tablă rectangulară care are o lățime pe care încap K cuburi și o lungime pe care se pot așeza L cuburi. Înainte de a se apuca de construit, Johny desenează planul orașului și împarte tabla în KŽL pătrățele. El dorește să așeze turnuri formate din unul sau mai multe cuburi pe câteva dintre pătrățele. Unele pătrățele pot rămâne libere. Deoarece tabla e mare, Johny nu poate planifica în mod exact numărul de cuburi care vor fi așezate pe câte un pătrățel. El a stabilit imaginea din față și cea lateral-dreapta a construcției și a desenat aceste două perspective (proiecții bidimensionale).

Tatăl lui Johny se teme că nu are destui bani pentru a cumpăra destule cuburi și vă roagă să scrieți un program care determină numărul minim și cel maxim de cuburi necesare realizării planului puștiului. Deoarece Johny poate greși desenele planului, programul va trebui să stabilească dacă orașul descris este realizabil sau nu.

Date de intrare:

Prima linie a fișierului TOWN.IN conține două numere întregi pozitive K, L - lățimea respectiv lungimea tablei (exprimate în număr de cuburi). Nici una dintre dimensiuni nu este mai mare decât 100000.

Următoarele linii ale fișierului de intrare conțin descrierea imaginii din față a orășelului. Descrierea este realizată prin șirul înălțimilor clădirilor vizibile pentru fiecare pătrățel de la stânga la dreapta (înălțimea se precizează de asemenea prin numărul de cuburi). Pe fiecare linie există un singur număr. Primele K linii descriu perspectiva din față, iar restul de L linii descriu perspectiva din lateral-dreapta.

În această descriere înălțimile sunt precizate de la linia din față spre cea din spate. Se știe că nu există clădire cu înălțimea mai mare decât 5000 de cuburi. Numărul maxim de cuburi necesare construirii orașului nu va depăși 2000000000.

Date de ieșire

- Fișierul de ieșire TOWN.OUT conține o singură linie.

- Dacă orașul nu poate fi construit pe baza desenelor lui Johny, în fișier se va scrie mesajul ‘No solution.'.

- Altfel, în fișier se vor scrie două numere, pe o singură linie, separate printr-un singur spațiu. Primul număr reprezintă numărul minim de cuburi necesare, iar al doilea reprezintă numărul maxim.

Exemple

TOWN.IN TOWN.OUT

4 3 10 21

1

3

4

2

1

4

2

TOWN.IN TOWN.OUT

2 2 No solution.

4

1

1

3

[cuprins]