Încercați-vă puterile!

PROBLEME propuse pentru rezolvare

Problemele de mai jos au fost propuse la concursul memorial "Nemes Tihamer" - 1998 - la care au participat 41 elevi din România. Credem că rezolvarea problemelor va oferi ocazia unui antrenament pentru mulți elevi pasionați de algoritmi. Mulțumim autorilor problemelor (D-l prof. Zsako Laszlo
și colaboratorii săi) pentru că ne-au acordat dreptul de a le publica în Ginfo.

P029801: Ogor

Pe un teren dreptunghiular s-au semănat mai multe tipuri de plante. Despre fiecare metru pătrat al terenului se știe cu ce fel de plantă a fost semănat. Se numește tabelă de plantă acel dreptunghi de arie maximă pe care s-a semănat un același tip de plantă.

În prima linie a fișierului PLANTE.IN sunt scrise numerele M și N, reprezentând dimensiunile terenului (1<=N<=50 și 1<=M<=50); numerele sunt despărțite printr-un spațiu. În următoarele MxN linii ale fișierului sunt scrise denumirile plantelor cu care s-a semănat fiecare metru pătrat. Matricea se traversează linie după linie.

Să se scrie un program care afișează pe ecran și scrie în fișierul TEREN.IN numărul tabelelor de plante.

Exemplu:

TEREN.IN: 
4 5 
Grau 
Grau 
Grau 
Cartof 
Cartof 
Grau 
Grau 
Grau 
Cartof 
Cartof 
Grau 
Grau 
Porumb 
Porumb 
Porumb 
Grau 
Grau 
Porumb 
Porumb 
Porumb 
TEREN.OUT: 
4 

P029802: Grăniceri

În Țara lui Papură Vodă locuitorii sunt identificați pe baza numelui. Dintre locui tori cel mult 500 au pașaport. Țara are N (<=9) puncte de trecere a frontierei. Se ține evi dența intrărilor și ieșirilor.

Evidențele anului precedent sunt în fișierul VAMA.INy în ordinea trecerii frontierei de către călători. y reprezintă numărul de ordine al punctului de frontieră. Fiecare linie conține numărul de ordine al zilei din an în care a avut loc trecerea frontierei, cuvântul IN sau OU (corespunzător intrării, respectiv ieșirii în/din țară) și numele persoanei (un nume este un șir de caractere de lungime <=40).

Să se scrie un program care:

A. scrie în fișierul AFARA.OUT numele persoanelor care în ultima zi a anului sunt în străinătate.

B. scrie în fișierul FRAUDE.OUT numele acelor persoane care au încălcat regula stabilită: nu se poate intra sau ieși consecutiv de mai multe ori în/din țară.

Exemplu:

VAMA.IN1: 
22 OU Pop Vasile 
23 IN Pop Vasile 
36 IN Rus Maria 
44 OU Cuc Ion 
170 IN Ion Ion 
192 IN Pop Vasile 
VAMA.IN2: 
38 OU Rus Maria 
167 OU Ion Ion 
178 OU Ion Ion 
188 OU Cuc Ion 
AFARA.OUT: 
Rus Maria 
Cuc Ion 
Ion Ion 
FRAUDE.OUT: 
Cuc Ion 
Pop Vasile 

P029803: Camping

În campingul "Făget" există K căsuțe care pot fi închiriate 365 zile din an. Orice turist poate închiria o căsuța din camping exact M zile din an. Campingul a adunat solici tările pe un an întreg, cu un an înainte. Fiecare turist precizează prima zi începând cu care dorește să închirieze (pe o perioadă de M zile) o căsuță.

Să se scrie un program care determină numărul maxim de turiști care vor putea fi primiți în camping.

În prima linie a fișierului CAMP.IN este scris numărul K (1<=K<=100) de căsuțe din camping. În a doua linie este scris numărul M (1<=M<=14). În a treia linie este scris numărul solicitărilor N (1<=N<=1000). În următoarele N linii sunt scrise solicitările. Re zultatul se va scrie în fișierul CAMP.OUT și se va afișa pe ecran.

Exemplu:

CAMP.IN: 
2 
7 
8 
1 
10 
2 
11 
1 
3 
4 
18 
CAMP.OUT: 
5 

P029804: Expediție pe Marte

Pe suprafața planetei Marte se adună mostre de rocă cu ajutorul unor vehicule speciale. Aceste vehicule se deplasează conform unei scheme de caroiaj doar spre sud sau est și doar pe un teren lipsit de stânci. Harta pusă la dispoziție conține informații cu privire la pozițiile unde se află roci (o rocă într-o poziție) și unde sunt stânci. Harta este dată sub forma unei matrice de dimensiune MxN care conține elemente egale cu 0, 1 și 2, având semnificația:

? 0 înseamnă teren gol

? 1 înseamnă rocă

? 2 înseamnă stâncă

Vehiculele pornesc din poziția (1,1) care este colțul din stânga sus a hărții. Locul unde trebuie să ajungă vehiculele este în colțul din dreapta jos al hărții (poziția (M,N)).

Să se scrie un program care determină numărul maxim de roci posibil de adunat, presupunând că avem un număr suficient de mare de vehicule.

Prima linie a fișierului MARTE.IN conține numerele M și N, despărțite printr-un spațiu (1<=M, N<=100). În următoarele M linii vom avea elementele liniilor matricei corespunzătoare hărții, despărțite prin câte un spațiu.

Să se scrie numărul maxim de roci pe ecran și în fișierul MARTE.OUT.

Exemplu:

MARTE.IN: 
10 12 
0 1 2 1 0 0 1 0 2 0 0 0 
0 1 0 0 0 2 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 2 0 0 0 
2 0 0 0 0 2 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 
0 2 0 0 2 0 0 0 0 0 0 0 
1 0 0 0 0 1 1 1 1 0 0 0 
1 1 1 1 1 2 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 0 1 0 0 
MARTE.OUT: 
14 

P029805: Hotel

Pentru un lanț de hoteluri se ține evidența bucătarilor și cofetarilor. În această evidență se pot realiza căutări după nivelul profesional și după vârstă.

Fișierele text BUCATAR.IN și COFETAR.IN conțin informații despărțite printr-un spațiu, structurate pe linii (o linie pentru o persoană):

  • nivelul profesional (1 corespunde celui mai ridicat nivel, 10 celei mai slabe pregătiri),
  • vârsta (număr întreg cuprins între 15 și 100),
  • numele (format din cel mult 40 caractere litere din alfabetul englez, cifre și spații).

În fiecare din cele două fișiere sunt informații despre cel mult 100 de persoane.

Întrebările la care trebuie să răspundă la un moment dat programul sunt în fișierul IN TREB.IN sub forma: xxxx:yyyy:zzzz, unde câmpurile sunt despărțite prin caracterul : (două puncte), iar xxxx reprezintă profesia, yyyy reprezintă nivelul profesional și zzzz vârsta persoanei (persoanelor) căutate.

xxxx = BUCATAR sau COFETAR sau ORICE

ORI CE are semnificația că persoana poate fi și bucătar, și cofetar.

yyyy =<N sau >N sau =N sau <=N sau >=N

yyy y precizează relația dintre nivelul profesional și numărul întreg N.

zzzz =MIN sau MAX

zzz z precizează informația cu privire la preferința prioritară pentru cea mai tânără sau cea mai în vârstă persoană.

Numele persoanelor găsite corespunzător criteriilor conținute în fișierul INTREB.IN se vor scrie în fișierul RASPUNS.OUT, un nume pe o linie. Dacă nu există nici o persoană care să corespundă criteriilor, în linia respectivă se va scrie ?NU ESTE?. Dacă sunt mai multe persoane se va alege prima persoană în ordine alfabetică după nume.

Exemplu:

BUCATAR.IN: 
1 35 Pop Vasile 
4 49 Muresan Ion 
BUCATAR.IN: 
1 35 Pop Vasile 
4 49 Muresan Ion 
INTREB.IN: 
BUCATAR:=4:MAX 
ORICE:<2:MAX 
COFETAR:>=3:MIN 
RASPUNS.OUT: 
Muresan Ion 
Rus Maria 
NU ESTE 

P029806: Radar

O bază aeriană este înzestrată cu un radar special care supraveghează spațiul aerian deasupra unei suprafețe de dimensiune 1000x1000. Radarul are rolul de a sesiza apariția unei rachete inamice. Colțul din stânga sus a suprafeței are coordonatele (1,1).

Baza este plasată pe un pătrat aflat între punctele de coordonate (496,496) și (505,505). Într-o unitate de timp radarul "vede" o singură porțiune de dimensiune 1000x100. (Începe cu prima porțiune, apoi continuă cu a doua ș.a.m.d., apoi reia din nou cu prima.)

Porțiune 1 Porțiune 2 ... Porțiune 10

Radarul poate sesiza o rachetă doar dacă aceasta se află în porțiunea supravegheată în unitatea de timp curentă.

Rachetele sunt lansate din afara suprafeței suprave gheate. Fiecare rachetă traversează un drum rectiliniu, cu viteză constantă, astfel încât ambele coordonate care îi precizează poziția se modifică de la o valoare întreagă la alta, diferența dintre ele fiind egală cu cel mult 10. La un moment dat, în aceeași poziție se pot afla mai multe rachete. Racheta lovește solul dacă la începutul unității de timp se află deasupra bazei. Racheta poate să fie distrusă în timpul zborului (de exemplu, poate fi anihilată).

Soldații din bază trebuie alertați dacă o rachetă se apropie de bază și dacă această rachetă a fost sesizată de trei ori de radar. Apropierea unei astfel de rachete trebuie semnalizată o singură dată.

Să se scrie un program care, în caz de nevoie, alertează soldații.

Datele de intrare se află în fișierul RACHETA.IN. Fișierul are cel mult 1000 linii și în fiecare linie se află trei date (numere întregi, despărțite de câte un blanc) referitoare la o sesizare: unitatea de timp în care a avut loc sesizarea, linia și coloana care determină poziția rachetei în momentul sesizării.

Datele de ieșire se vor afișa pe ecran și în fișierul de ieșire RACHETA.OUT și constă din datele de semnalizare, adică alertarea. În fiecare linie se vor scrie 4 numere în tregi despărțite de câte un blanc: unitatea de timp în care are loc alertarea, unitatea de timp la care se așteaptă lovirea solului, linia și coloana care precizează poziția în care racheta va lovi solul.

Exemplu:

RACHETA.IN: 
1 1 1 
7 506 5 
11 21 21 
17 526 35 
21 41 41 
27 546 65 
31 61 61 
37 566 95 
41 81 81 
48 588 128 
51 101 101 
61 121 121 
RACHETA.OUT: 
21 249 497 497 

P029807: Închirieri auto

O întreprindere de transporturi închiriază autovehicule. Unul din vehicule este extrem de solicitat, de aceea, soli citările pentru anul următor se adună pe parcursul anului curent. Solicitarea se precizează printr-o pereche de numere A B, unde A reprezintă numărul de ordine al zilei din an începând cu care clientul dorește să închirieze vehiculul și B reprezintă numărul de ordine al zilei din an, când închi rierea încetează. Întreprinderea vrea să planifice închirierile cât mai profitabil și în acest scop acceptă doar acele solicitări care, satisfăcute integral, asigură (în totalitatea lor) o închiriere pe un număr maxim posibil de zile.

Să se scrie un program care determină, pe baza solici tărilor, numărul maxim posibil de zile în care vehiculul poate fi închiriat.

Fișierul AUTO.IN conține solicitările. Prima linie conține numărul de solicitări N (1<=N<=1000). În următoarele N linii sunt solicitările, adică perechi de numere A B, despărțite de câte-un spațiu (1<=A<=B<=365).

Rezultatul se va scrie pe ecran și în fișierul AUTO.OUT.

Exemplu:

AUTO.IN: 
10 
1 23 
6 37 
24 43 
46 71 
12 54 
44 66 
13 25 
22 33 
5 10 
AUTO.OUT: 
69 

P029808: Robot

Într-o fabrică, s-a automatizat procesul de producție. Mașinile sunt așezate într-o hală conform unui caroiaj. La sfârșitul zilei de lucru, piesele fabricate de mașini sunt adunate de roboți. Roboții se deplasează pe pistele lor în spațiul de deasupra mașinilor, corespunzător aceluiași caroiaj. Roboții pornesc din colțul din stânga sus (1,1) și trebuie să ducă piesele în colțul din dreapta jos. Roboții sunt programați astfel încât se deplasează doar în dreapta și în "jos".

Să se scrie un program care determină numărul minim de roboți care trebuie porniți pentru a se strânge toate piesele fabricate, știind că un robot poate transporta un număr oarecare de piese.

Harta halei se dă sub forma unui tablou bidimensio nal de dimensiune MxN, având elemente egale cu 0 și 1. Valoarea 1 are reprezintă o mașină, valoarea 0 reprezintă spațiu liber în hală.

Fișierul ROBOT.IN conține în prima linie valorile M și N, despărțite de câte un spațiu (1<=M,N<=100). Pe următoarele M linii sunt elementele tabloului corespunzător halei. Valorile 0 și 1 sunt despărțite de câte un spațiu.

Rezultatul se va scrie în fișierul ROBOT.OUT.

Exemplu:

ROBOT.IN: 
10 12 
0 1 1 1 0 0 1 0 1 0 0 0 
0 1 0 0 0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 1 0 0 0 
1 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 
0 1 0 0 1 0 0 0 0 0 0 0 
1 0 0 0 0 1 1 1 1 0 0 0 
1 1 1 1 1 1 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 0 1 0 0 
ROBOT.OUT: 
5 

P029809: Compilator

Se consideră un limbaj de programare. Un program scris în acest limbaj poate încărca cu date o porțiune de memorie având 1024 de locații de dimensiune 8 biți (începând cu prima locație).

Instrucțiunile limbajului:

Eticheta: x(BUC) scrie valoarea lui x în BUC locații (0<=x, BUC<=255)

Eticheta: 'x'(BUC)scrie codul caracterului x în BUC locații (0<=BUC<=255)

Eti heta: 'xxxxxx' scrie codurile caracterelor șirului de caractere xxxxxx în următoarele locații ale memoriei

Eti cheta: <X> scrie adresa X (16 biți) în următoarele locații de memorie (prima locație conține octetul inferior, a doua octetul superior)

Eti cheta: [X] scrie conținutul adresei X (8 biți) în ur mă toarea locație

Eti cheta: este un șir de caractere format din maxim 6 litere ale alfabetului englez, după care este scris caracterul "două puncte". Prezența etichetei este opțională. Pot exista oricâte blancuri, dar nu in interiorul numerelor și etichetelor.

Să se scrie un algoritm prin care un program (scris corect) se citește din fișierul PROGRAM.IN. Acest program trebuie "compilat". Să se afișeze pe ecran și să se scrie în fișierul PROGRAM.OUT rezultatul "compilării" (conținutul locațiilor de memorie).

În fișierul PROGRAM.IN fiecare instrucțiune este scrisă pe linie nouă.

Exemplu:

PROGRAM.IN: 
A: 12 (2) 
'a'(3) 
B: "bcd" 
[A] 
< A > 
<C> 
C: [B] 
PROGRAM.OUT: 
12 12 97 97 97 98 99 100 12 1 0 14 0 98 

Așteptăm soluții pe adresa redacției (preferabil prin e-mail), până la data de 1 mai 1998.

[cuprins]