www.agora.ro

Încercați-vă puterile!

PROBLEME propuse pentru REZOLVARE

După câteva numere ale GInfo în care v-am "necăjit" cu probleme grele, vă propunem un set de enunțuri care au constituit proba regională pentru concursul "Nemes Tihamér", cu etapa finală la Budapesta.

P039901: Olimpiadă

  La Olimpiada de informatică din Țara lui Papură Vodă se organizează baraje cât timp există concurenți care se află la egalitate. La fiecare baraj nou, participarea este obligatorie numai pentru acești concurenți, iar punctajul obținut se folosește numai pentru departajarea acestora. (După ultimul baraj nu mai există concurenți la egalitate.) La baraje pot participa și acei concurenți a căror clasare este deja stabilită. Aceștia vor primi puncte ca și ceilalți, dar nu-și mai pot schimba poziția în clasament. Dacă nu participă la un baraj, primesc 0 puncte.

Pe prima linie a fișierului OLI.IN se află scris numărul concurenților (1ŁNŁ1000) și numărul barajelor (1ŁMŁ10). Pe următoarele M linii sunt scrise rezultatele celor M baraje. Fiecare linie conține N numere nenegative despărțite prin câte un spațiu.

Scrieți un program care scrie în fișierul OLI.OUT numărul de ordine al candidaților, în ordine descrescătoare după punctajul obținut, despărțite prin câte un spațiu.

Exemplu:

 OLI.IN: OLI.OUT:
 5 3 4 1 5 2 3 
 7 3 3 9 7 
 2 7 7 0 1 
 0 3 2 0 8

P039902: Familia

  Relațiile familiale se definesc astfel încât corespunzător fiecărei persoane se precizează numele mamei și al tatălui.

Pe prima linie a fișierului FAM.IN se află numărul persoanelor cunoscute (1ŁNŁ100). Pe următoarele 3*N linii sunt scrise datele referitoare la cele N persoane: numele persoanei, numele tatălui și numele mamei. Ultima linie conține un singur nume care reprezintă numele persoanei ale cărei rude trebuie să le depistați. Un nume poate conține cel mult 20 de caractere.

Scrieți un program care va scrie în fișierul FAM.OUT următoarele 4 linii:

A. Numărul fraților persoanei precizate și numele lor, despărțite prin câte un spațiu.

B. Numărul fraților vitregi ai persoanei precizate și numele lor, despărțite prin câte un spațiu. (Frații vitregi au fie aceeași mamă, fie același tată.)

C. Lista strămoșilor pe linia tatălui persoanei precizate (tatăl, bunicul, străbunicul, stră-străbunicul etc., atât cât e posibil de depistat), despărțiți prin câte un spațiu.

D. Numărul verilor primari ai persoanei precizate și numele lor, despărțite prin câte un spațiu. (Verii au un bunic sau o bunică comună printre persoanele cunoscute.)

Exemplu:

 FAM.IN: FAM.OUT:
 7 1 Pop Andrei 
 Pop Andrea 1 Pop Erica 
 Pop Stefan 2 Pop Stefan Pop Petru 
 Rus Ana 1 Cretu Melinda 
 Pop Andrei 
 Pop Stefan 
 Rus Ana 
 Pop Erica 
 Pop Stefan 
 Popescu Mihaela 
 Pop Stefan 
 Pop Petru 
 Cretu Eleonora 
 Rus Ana 
 Rus Ioan 
 Cuc Felicia 
 Bucur Silvia 
 Bucur Florin 
 Cuc Felicia 
 Cretu Melinda 
 Cretu Dan 
 Bucur Silvia 
 Pop Andrea 

P039903: Joc de cuvinte

  Un joc logic de tip scrabble se joacă pe baza unui dicționar. Esența jocului constă în determinarea unei secvențe de cuvinte, pornind de la un cuvânt dat. Secvențapoate fi compusă doar din cuvinte existente în dicționar. Cuvinte consecutive se pot obține pe baza unei transformări elementare din cuvântul precedent. Există două reguli care trebuie respectate în efectuarea unei transformări elementare:

Regula A: schimbarea unei litere cu o altă literă;

Regula B: schimbarea unei litere cu o altă literă sau adăugarea unei litere la capătul cuvântului.

Pe prima linie a fișierului DICTIO.IN se află numărul cuvintelor din dicționar (1 Ł N Ł 1000), pe următoarele N linii avem câte un cuvânt din dicționar. Un cuvânt este format din cel mult 20 de caractere. Pe prima linie a fișierului JOC.IN se află litera regulii care trebuie aplicată (A sau B), iar pe următoarele două linii se află câte un cuvânt din dicționar (P și Q, cuvinte diferite).

Scrieți un program care scrie în fișierul JOC.OUT următoarele:

1. Pe prima linie se va scrie cuvântul DA în cazul în care din cuvântul P se poate obține cuvântul Q conform regulii date, altfel se va scrie NU. În caz afirmativ, după cuvântul DA va urma un spațiu, apoi un număr care reprezintă numărul minim de aplicații ale regulei în urma cărora se poate obține Q din P.

2. Pe cea de a doua linie se vor scrie toate cuvintele care se pot obține din cuvântul P pe baza regulei.

Exemplu:

 DICTIO.IN: JOC.IN:
 7 A 
 OKOS OKOS 
 ÁKOS ÁLOM 
 ÁKOM 
 OKOD  JOC.OUT: 
 ÁLOM DA 3 
 ALOM OKOS ÁKOS ÁKOM ÁLOM ALOM OKOD 
 HALOM 

P039904: Cuburi

  Turnurile de cuburi se pot construi așezând deasupra unui cub cuburi mai ușoare și având laturi mai mici.

Scrieți un program care determină cel mai înalt turn care se poate construi din N cuburi! Înălțimea se calculează însumând laturile cuburilor din turn.

În prima linie a fișierului CUB.IN se află numărul cuburilor (1 Ł N Ł 1000). În următoarele N linii se află latura și greutatea cuburilor (numere naturale mai mici decât 20000) despărțite printr-un singur spațiu.

Să se scrie pe ecran și pe prima linie a fișierului CUB.OUT numărul M al cuburilor din care s-a construit cel mai înalt turn, următoarele M linii fiind rezervate laturilor și greutăților acestora în ordinea construcției (de jos în sus).

Exemplu:

 CUB.IN: CUB.OUT: 
5 3 
 10 3 20 5 
 20 5 10 3 
 15 6 10 2 
 15 1 
 10 2 

P039905: Prietenii

  Într-un grup de N elevi s-a pus întrebarea: Cine îți este cel mai simpatic? Datele au fost trecute într-un tabel.

Pe prima linie a fișierului PRIETEN.IN se află numărul elevilor (2 Ł N Ł 1000), restul de N linii vor fi completate cu numele elevilor și cu răspunsul lor la întrebare, separate prin spații. Numele elevilor precum și răspunsul nu pot conține spații și nu pot fi mai lungi decât 20 de caractere.

Scrieți un program care scrie în fișierul PRIETEN.OUT (linie cu linie) următoarele:

A. În prima linie se va scrie numele celor care nu sunt simpatizați de nimeni, separate prin câte un spațiu.

B. În cea de a doua linie se vor scrie acele perechi care se simpatizează reciproc, dar nu sunt simpatici altora. Cele două nume, aparținând unei perechi se vor uni cu o liniuță (-), iar o pereche se va despărți de o altă pereche printr-un spațiu.

C. În cea de a treia linie se va scrie numele celui mai simpatizat elev. Dacă sunt mai mulți, numele lor se vor despărți printr-un spațiu.

D. În cea de a patra linie se va scrie numărul cel mai mare de grupuri în care pot fi împărțiți elevii, astfel încât fiecare elev să ajungă în acel grup în care este și persoana pe care o simpatizează cel mai mult.

Exemplu:

 PRIETEN.IN: PRIETEN.OUT:
 5 B 
 A C D-E 
 B A A 
 C A 2 
 D E 
 E D 

P039906: Proiect

  O construcție de mare anvergură a început cu desemnarea pozițiilor posibile a clădirilor pe terenul de construcție. Toate clădirile au baza în formă de dreptunghi. Acesta se va preciza prin coordonatele colțului stânga-jos (x, y) și prin lungimile laturilor paralele cu axa Ox (dx), respectiv axa Oy (dy). Clădirile trebuie așezate în așa fel încât să nu se acopere, adică privind din origine nici o clădire nu poate acoperi nici un punct al altor clădiri.

Scrieți un program care determină numărul maxim de clădiri care nu se acoperă una pe alta.

Pe prima linie a fișierului PLAN.IN este scris numărul așezărilor posibile (1<N<5000). Următoarele N linii conțin fiecare câte patru numere naturale despărțite prin câte un spațiu, reprezentând datele corespunzătoare unei posibile așezări: x y dx dy (0<x,y,dx,dy<20000). Primele două numere corespund coordonatelor stânga jos ale clădirii (x,y), al treilea și al patrulea reprezintă lungimea laturii paralele cu axa Ox, respectiv cu axa Oy.

Pe prima linie a fișierului PLAN.OUT se va scrie numărul maxim (K) de clădiri care se pot așeza respectând cerințele problemei. Pe următoarele K linii se vor scrie datele referitoare la clădirile așezate, în aceeași structură ca în fișierul PLAN.IN.

Exemplu:

 PLAN.IN: PLAN.OUT: 
 9 4 
 3 11 2 3 1 8 2 4 
 1 8 2 4 6 10 2 2 
 4 2 1 1 4 2 1 1 
 6 10 2 2 11 1 3 2 
 6 6 1 3 
 6 6 1 7 
 7 9 2 3 
 11 1 3 2 
 7 4 2 1 

P039907: Camion

  O întreprindere produce subansambluri în uzinele sale din diferite orașe ale țării. Producția realizată pe parcursul unei săptămâni este transportată cu camioane în depozitul central, la sfârșitul săptămânii. Din cauza limitării circulației, camioanele circulă între două orașe într-o singură direcție. De aceea întreprinderea planifică transporturile astfel încât din fiecare oraș în care nu se poate ajunge din alt oraș, pornește câte un camion, iar din celelalte nu pornește nici unul. Datorită restricțiilor, drumul fiecărui camion spre depozitul central este determinat în mod univoc.

Oricare camion al cărui drum trece printr-un oraș poate încărca oricâte subansambluri fabricate în acel oraș, cu condiția să nu fie plin. Cunoscând numărul subansamblurilor fabricate în fiecare oraș, determinați capacitatea minimă pentru camioane astfel încât transportul să fie realizat în întregime. Se presupune că toate camioanele au capacități identice.

Pe prima linie a fișierului CAMION.IN este scris numărul orașelor N (1<N<200). Depozitul central se află în orașul având numărul de ordine 1 și de aici nu se fac transporturi. Pe următoarele N-1 linii sunt scrise câte două numere întregi, despărțite prin căte un spațiu. Primul număr de pe linia I reprezintă orașul unde camionul poate ajunge din orașul I. Al doilea număr reprezintă numărul subansamblurilor fabricate în orașul I. (Drumul de ieșire din orașul 1 nu este dat.)

Programul va scrie în fișierul CAMION.OUT acea capacitate minimă a camioanelor care este suficientă pentru transportul tuturor subansamblurilor. Acest rezultat va fi un număr întreg.

Exemplu:

 CAMION.IN CAMION.OUT 
8 12 
 1 2 
 1 3 
 1 4 
 2 5 
 3 6 
 3 7 
 4 8 

P029908: Pistă cu obstacole

  Un vehicol se poate mișca pe un teren având structura unui caroiaj format din M linii și N coloane. Un pătrat din caroiaj poate fi vid sau poate conține o șină care îl traversează și pe care vehicolul se poate deplasa. Un pătrat are patru vecini în caroiaj, la stânga, la dreapta, în jos și în sus. Vehicolul poate efectua la un moment dat una din următoarele trei operații:

1. Învârte cu 90° pătratul pe care se află.

2. Trece pe un pătrat vecin dacă acesta conține o șină poziționată astfel încât șina de pe pătratul curent se potrivește cu ea.

3. Învârte cu 90° un pătrat vecin.

Scrieți un program care determină numărul minim al operațiilor pe care le va efectua vehicolul pentru traversarea pistei din colțul stânga sus (1,1) în colțul dreapta jos (M,N).

Pe prima linie a fișierului PISTA.IN se află o pereche de numere M N despărțite printr-un spațiu (1 Ł M,N Ł 100). Următoarele M linii conțin fiecare câte N numere despărțite prin câte un spațiu:

0: pătrățelul nu conține șină (este gol);

1: pătrățelul conține o șină orientată orizontal;

2: pătrățelul conține o șină orientată vertical.

Se va scrie în fișierul PISTA.OUT numărul minim al operațiilor pe care le va efectua vehicolul pentru traversarea pistei din colțul stânga sus în colțul dreapta jos. Dacă vehicolul nu poate traversa drumul, rezultatul va fi -1.

Exemplu:

 PISTA.IN:
 6 7 
 1 1 1 1 2 2 1 
 0 1 2 2 0 1 1 
 1 0 0 2 0 1 1 
 1 1 1 2 0 1 1 
 1 1 2 0 1 1 1 
 1 1 2 1 1 1 1 
 PISTA.OUT:  
 17

[cuprins]