www.agora.ro

Încercați-vă puterile!

PROBLEME propuse pentru REZOLVARE

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

P020001: La florărie

Dorești să-ți aranjezi florile în vitrina florăriei într-un mod cât mai plăcut. Ai F buchete de flori diferite, un buchet fiind compus din mai multe flori, având același tip și ai câteva vaze așezate într-o linie. Vazele sunt fixate pe un raft și sunt numerotate consecutiv de la 1 la V, unde V reprezintă numărul de vaze. Numărătoarea s-a făcut de la stânga la dreapta. Buchetele trebuie puse în vaze și sunt identificate în mod unic printr-un număr întreg de la 1 la F. Aceste numere de identificare au următoarea semnificație: ele determină ordinea în care trebuie să apară buchetele în vaze: buchetul i trebuie așezat într-o vază care se află la stânga față de vaza care conține buchetul j pentru oricare i < j. Să presupunem, de exemplu, că numărul de ordine al buchetului de azalee este 1, numărul de ordine al buchetului de begonii este 2 și numărul de ordine al buchetului de garoafe este 3. Toate buchetele trebuie așezate în vaze conform numerelor lor de ordine. Buchetul de azalee trebuie așezat într-o vază aflată în stânga vazei în care se pun begoniile, iar begoniile într-o vază din stânga garoafelor. Dacă există mai multe vaze decât buchete, anumite vaze vor rămâne goale. Într-o vază se va așeza un singur buchet.

Fiecare vază are o caracteristică distinctă, astfel, în urma așezării unui buchet într-o vază rezultă o valoare estetică, exprimată printr-un număr întreg. Aceste valori estetice sunt prezentate în tabelul de mai jos. Dacă o vază rămâne goală, valoarea estetică este 0.

Conform tabelului, azaleele vor arăta meseriaș în vaza 2, dar mizerabil în vaza 4.

În ideea de a obține cea mai plăcută imagine trebuie să maximizezi suma valorilor estetice ale aranjamentului în condițiile respectării cerinței cu privire la ordinea florilor. Dacă mai multe aranjamente au aceeași sumă maximă a valorilor estetice se acceptă oricare dintre acestea. În fișierul de ieșire se va scrie un singur aranjament.

Restricții

- 1 Ł F Ł 100, unde F reprezintă numărul buchetelor de flori. Buchetele sunt numerotate de la 1 la F.

- F Ł V Ł 100, unde V reprezintă numărul vazelor.

- -50 Ł Aij Ł 50, unde Aij reprezintă valoarea estetică obținută dacă buchetul i se pune în vaza j.

Intrare

Numele fișierului de intrare este flower.inp.

- pe prima linie sunt scrise două numere: F și V;

- fiecare din următoarele F linii conțin V numere întregi, astfel Aij este al j-lea număr în cea de-a (i+1)-a linie a fișierului de intrare.

Ieșire

Fișierul de ieșire flower.out trebuie să conțină două linii:

- Prima linie va conține suma valorilor estetice obținută pentru aranjamentul care se va descrie pe cea de-a doua linie.

- Cea de-a doua linie descrie aranjamentul sub forma unei secvențe de F numere, astfel încât al k-lea număr de pe această linie reprezintă numărul de ordine al vazei în care s-a așezat buchetul k.

Exemplu

flower.inp

3 5

7 23 -5 -24 16

5 21 -4 10 23

-21 5 -4 -20 20

flower.out

53

2 4 5

P020002: Coduri ascunse

Se consideră un anumit număr de cuvinte și un text. Textul conține un mesaj format din cuvintele care s-au ascuns în acesta într-o formă ciudată (și posibil ambiguă).

Cuvintele și textul sunt secvențe de litere mici și majuscule aparținând doar alfabetului englez. Literele mici diferă de majuscule. Lungimea cuvântului este definită în modul cunoscut. De exemplu, cuvântul ALL are lungimea 3.

Literele cuvântului nu trebuie să apară consecutiv în textul dat. De exemplu, cuvântul ALL va apărea în text întotdeauna în interiorul unei subsecvențe de forma AuLvL unde u și v sunt secvențe arbitrare de litere (posibil vide). Spunem că AuLvL este o secvență acoperitoare pentru ALL. În general, o secvență acoperitoare corespunzătoare unui cuvânt se definește ca fiind o subsecvență a textului, astfel încât prima și ultima literă a subsecvenței sunt identice cu prima și ultima literă ale cuvântului, iar prin ștergerea anumitor litere (sau a nici uneia) este posibil să se obțină cuvântul. Trebuie să rețineți că un cuvânt poate să apară în interiorul uneia sau a mai multor secvențe acoperitoare sau să nu apară deloc în text. De asemenea, rețineți că o secvență acoperitoare poate fi secvență aco-peritoare pentru mai multe cuvinte.

O secvență acoperitoare se identifică prin numărul de ordine (în cadrul textului) al primei litere și prin numărul de ordine al ultimei litere. (Prima literă din text are numărul de ordine 1.) Spunem că două secvențe acoperitoare c1 și c2, nu se suprapun dacă prima literă din c1 are numărul de ordine mai mare (>) decât ultima literă din c2 sau invers. În caz contrar, spunem că cele două secvențe acoperitoare se suprapun.

În scopul extragerii mesajului ascuns în text, trebuie să construiești o soluție. O soluție este formată din mai multe seturi, care la rândul lor sunt formate fiecare dintr-un cuvânt și dintr-o secvență acoperitoare a cuvântului respectiv, respectând următoarele condiții:

a) Secvențele acoperitoare nu se suprapun.

b) Lungimea maximă a unei secvențe acoperitoare este 1000.

c) Suma lungimilor cuvintelor este maximă. (Numărul termenilor din suma cerută este egal cu numărul seturilor, în suma respectivă aflându-se lungimile cuvintelor din fiecare set.)

În cazul în care există mai multe soluții, se cere una singură.

Restricții

- 1 Ł N Ł 100 unde N reprezintă numărul cuvintelor.

- Lungimea maximă a unui cuvânt este 100 de litere.

- 1 Ł lungimea textului dat Ł 1000000 litere.

Spunem despre o secvență acoperitoare c, corespunzătoare unui cuvânt w, că este dreapta-minimală dacă nici un prefix propriu al lui c nu este secvență acoperitoare pentru w. (Un prefix propriu al lui c este o subsecvență de început a lui c care nu este egală cu c.) De exemplu, pentru cuvântul ALL, secvența acoperitoare AAALAL este dreapta-minimală, pe când secvența AAALALAL este acoperitoare, dar nu este dreapta-minimală.

Se garantează că

a) pentru fiecare poziție din textul dat, numărul secvențelor acoperitoare dreapta-minimale, care evident se vor suprapune, este cel mult 2500;

b) numărul secvențelor acoperitoare dreapta-minimale este cel mult 10000.

Intrare

Vor exista două fișiere text: words.inp și text.inp. Fișierul words.inp conține lista cuvintelor, iar text.inp conține textul.

- Prima linie a fișierului words.inp conține numărul N.

- Fiecare din următoarele N linii conține câte un cuvânt care este scris sub forma unei secvențe de litere, fără spații. Cuvintele se identifica prin numerele lor de ordine din fișierul de intrare words.inp; acestea sunt numere întregi având valori între 1 și N.

- Fișierul text.inp conține o secvență de litere (la sfârși-tul căreia există simbolurile sfârșit de linie și sfârșit de fișier). Fișierul nu conține spații.

Ieșire

Fișierul de ieșire de tip text va avea numele codes.out.

- Pe prima linie se va scrie suma obținută pe baza soluției obținute.

- Fiecare din următoarele linii descrie un set al soluției: o linie va conține trei numere întregi i, s, e, despărțite prin câte un spațiu. (i este numarul de ordine al cuvântului care apare în secvența acoperitoare descrisă prin s și e, unde s este numărul de ordine în text al primei litere a secvenței acoperitoare, iar e reprezintă numărul de ordine în text al ultimei litere a secvenței acoperitoare.) Ordinea acestor linii în fișier este oarecare.

Exemplu

words.inp text.inp

4 StXRuYNvRuHoaBbvizXztNwRRuuNNP

RuN

RaBbit HoBbit

StoP

codes.out

12

2 9 21

1 4 7

1 24 28

Explicație

Mesajul ascuns care poate fi extras din soluție este "RuN RaBbit RuN". (O altă soluție ar putea fi "RuN HoBbit RuN").

P020003: Oraș subteran

Să presupunem că ești prizionerul unui oraș subteran din Cappadocia. Presupunem în continuare că ai avut un noroc incredibil și ai găsit harta orașului. Din nefericire pe ea nu este marcat punctul unde te afli. Trebuie să determini locul, unde ai găsit harta explorând orașul.

Harta orașului este de formă dreptunghiulară, împărțită în pătrate având latura unitate. Fiecare pătrat poate fi parte dintr-un coridor sau parte dintr-un zid. Coridorul este marcat cu litera 'O', zidul este marcat cu litera 'W'. Direcția nord este marcată pe hartă. Din fericire ai o busolă astfel încât poți orienta corect harta. Inițial, te afli în coridor.

Totul începe prin apelarea procedurii (sau funcției) start fără argumente. Poți să explorezi orașul utilizând procedurile (sau funcțiile) look și move.

Poți pune întrebări apelând funcția look(dir) unde dir arată direcția spre care privești, care poate fi exprimată prin unul din caracterele 'N', 'S', 'E' și 'W' reprezentând nord, sud, est și respectiv vest. Presupunem că valoarea argumentului dir este 'N'. Dacă pătratul vecin, spre nord, cu pătratul pe care te afli este parte din coridor, răspunsul va fi litera 'O' iar în cazul în care acesta este parte din zid, răspunsul va fi 'W'. Similar, este posibil să privești și să primești informație despre alte pătrate învecinate celui în care te afli.

Poți să treci într-unul din cele patru pătrate vecine, folosind move(dir) unde dir reprezintă direcția pasului și a fost prezentată anterior. Poți să te muți doar într-un pătrat ce reprezintă o parte din coridor. Încercarea de a te muta într-un pătrat care reprezintă o parte dintr-un zid, va fi o greșală gravă. Este posibil să ajungi în orice pătrat reprezentând coridor, pornind dintr-un loc care de asemenea este parte din coridor.

Trebuie să găsești poziția pătratului unde ai găsit harta, apelând look(dir) de un număr minim de ori. Odată ce poziția hărții a fost determinată, aceasta trebuie înregistrată apelând finish(x,y)unde x reprezintă coordonata orizontală (vest-est) iar y reprezintă coordonata verticală (sud-nord) a poziției.

Restricții

- 3 Ł U Ł 100, unde U este lățimea hărții, adică lungimea hărții în număr de pătrate pe orizontală (vest-est);

- 3 Ł V Ł 100, unde V este înălțimea hărții, adică lungimea hărții în număr de pătrate pe verticală (sud-nord);

- orașul este încercuit de ziduri incluse pe hartă;

- colțul de sud-vest al orașului are coordonatele (1,1) și colțul de nord-est are coordonatele (U,V).

Intrare

Numele fișierului de intrare de tip text este under.inp.

- Prima linie conține două numere: U, V.

- Fiecare din următoarele V linii conțin o linie a hărții pe direcția orizontală. Fiecare linie conține U caractere, astfel încât al x-lea caracter de pe a (V-y+2)-a linie din fișierul de intrare conține informație despre poziția (x,y) a hărții: litera 'W' reprezintă zid, litera 'O' reprezintă coridor. Informațiile de pe linii nu sunt despărțite prin spații.

Ieșire

Nu va fi generat nici un fișier de ieșire. Rezultatul găsit de programul tău trebuie să fie raportat apelând subprogramul finish(x,y).

Exemplu

under.inp:

5 8

WWWWW

WWWOW

WWWOW

WOOOW

WOWOW

WOOWW

WWOOW

WWWWW

O posibilă secvență care se încheie cu apelul corect al subprogramului finish :

Interacțiunea

start ()

look('N') 'W'

look('E') 'O'

move('E')

look('E') 'W'

finish(3,5)

Instrucțiuni pentru programatorii în Pascal

Programul vostru trebuie să conțină linia:

uses undertpu;

Acest unit va furniza următoarele:

procedure start; {apelată prima}

function look (dir:Char):Char;

procedure move (dir:Char);

procedure finish (x,y:Integer);

{apelată ultima}

 

Instrucțiuni pentru programatorii în C/C++

Programul vostru trebuie să conțină linia:

#include "under.h"

Acesta va furniza următoarele:

void start (void); // apelată prima

char look (char);

void move (char);

void finish (int,int); // apelată ultima

P020004: Semafoare

În orașul Dingilville traficul este organizat într-un mod neobișnuit. Există intersecții și drumuri care leagă aceste intersecții. Între două intersecții există cel mult un drum. Nu există drum care să lege o intersecție cu ea însăși. Timpul de deplasare pe un drum este același pentru ambele direcții. La fiecare intersecție este un singur semafor a cărui culoare într-un anumit moment este fie albastră fie roșie. Culoarea fiecărui semafor alternează periodic: o anumită perioadă de timp culoarea este albastră, o altă perioadă este roșie. Traficul permite deplasarea între oricare două intersecții, dacă și numai dacă, semafoarele din ambele intersecții sunt de aceeași culoare în momentul plecării din una din ele spre cealaltă. Dacă un vehicul sosește într-o intersecție exact în momentul în care cel puțin una din culorile semafoarelor se schimbă, trebuie luate în considerare culorile noi ale semafoarelor. Vehiculele pot aștepta în intersecții. Se dă o hartă a orașului pe care sunt afișate:

- timpii de deplasare pentru toate drumurile (numere întregi);

- duratele celor două culori corespunzătoare fiecărei intersecții (numere întregi);

- culoarea inițială a semaforului și timpul rămas (număr întreg) pentru această culoare până la schimbarea acestei culori pentru fiecare intersecție.

Găsiți modul de parcurgere a drumului (după ce a pornit traficul) dintre punctul de pornire și punctul de sosire, astfel încât timpul de parcurgere să fie minim. În cazul în care există mai multe drumuri care satisfac cerințele problemei se va afișa unul singur.

Restricții

- 2 Ł N Ł 300, unde N reprezintă numărul de intersecții. Intersecțiile sunt identificate prin numere întregi de la 1 la N. Aceste numere se numesc numere de identificare.

- 1 Ł M Ł 14000, unde M reprezintă numărul drumurilor.

- 1Ł lij Ł100, unde lij reprezintă timpul necesar de deplasare de la intersecția i la intersecția j utilizând drumul de legătură dintre i și j.

- 1 Ł tic Ł 100, unde tic este durata unei culori c pentru semaforul din intersecția i. Indexul c este B pentru culoarea albastră, respectiv P pentru culoarea roșie.

- 1 Ł ric Ł tic , unde ric este timpul rămas pentru culoarea inițială c în intersecția i.

Intrare

Fișierul text de intrare este lights.inp:

- prima linie conține două numere: numărul de identificare al intersecției de plecare și numărul de identificare al intersecției de sosire;

- a doua linie conține două numere: N și M;

- următoarele N linii conțin informații despre cele N intersecții; pe linia (i+2) a fișierului de intrare se află informații despre intersecția i : Ci, ric, tiB, tiP unde Ci este fie 'B' fie 'P', indicând culoarea inițială a semaforului din intersecția i;

- următoarele M linii conțin informații despre cele M drumuri. Fiecare linie are următorul format: i, j, lij unde i și j sunt numerele de identificare ale intersecțiilor care sunt legate prin acest drum.

Ieșire

Fișierul text de ieșire se numește lights.out

Dacă există drum, atunci:

- prima linie va conține timpul minim de parcurgere a drumului dintre intersecția de pornire și intersecția de sosire.

- A doua linie va conține lista intersecțiilor de pe drumul minim găsit. În fișierul de ieșire trebuie scrise intersecțiile în ordinea parcurgerii lor. Astfel, primul număr întreg din această linie va fi numărul de identificare pentru intersecția sursă și ultimul număr întreg va fi numărul de identificare a intersecției destinație.

Dacă nu există drum, atunci fișierul va conține o singură linie pe care se va scrie numărul întreg 0.

Exemplu

lights.inp lights.out

1 4 127

4 5 1 2 4

B 2 16 99

P 6 32 13

P 2 87 4

P 38 96 49

1 2 4

1 3 40

2 3 75

2 4 76

3 4 77

P020005: Nivelare

Fie un joc care folosește un șir de N stive unde fiecare stivă conține zero sau mai multe discuri. Stivele sunt identificate prin numere întregi de la 1 la N. O mutare în acest joc constă din alegerea unei stive (p) și specificarea unui număr (k) urmând să se mute câte k discuri de pe stiva p pe stivele vecine ale acesteia. Vezi figura 2. Stiva p are doi vecini, p-1 și p+1 dacă 1<p<N; stiva 1 (p=1) are un singur vecin: stiva 2; stiva N (p=N) are de asemenea un singur vecin: stiva N-1. Rețineți că pentru a putea realiza o astfel de mutare, pe stiva p trebuie să existe cel puțin 2k discuri dacă stiva p are doi vecini și cel puțin k discuri, dacă stiva p are un singur vecin.

Scopul jocului este de a "nivela", printr-un număr minim de mutări, toate stivele, ceea ce înseamnă că cele N stive trebuie să conțină același număr de discuri. În cazul în care există mai multe soluții, se va afișa una singură.

Stive: 1 2 3 4 5

Stive: 1 2 3 4 5

Restricții

- se garantează că stivele se pot nivela în cel mult 10000 de mutări;

- 2 Ł N Ł 200;

- 0 Ł Ci Ł 2000, unde Ci este numărul discurilor de pe stiva i la începutul jocului (1 Ł i Ł N).

Intrare

Fișierul de intrare flat.inp are două linii:

- pe prima linie se află N;

- pe a doua linie se află N numere întregi; al i-lea număr va fi valoarea lui Ci.

Ieșire

Fișierul text de ieșire va fi flat.out:

- prima linie va conține numărul de mutări (fie acesta M);

- următoarele M linii vor conține două numere întregi reprezentând mutarea: p, k.

Ordinea mutărilor în fișierul de ieșire trebuie să coincidă cu ordinea în care s-au făcut mutările în timpul jocului. Astfel, prima mutare trebuie să fie scrisă în a doua linie a fișierului de ieșire.

Exemplu

flat.inp flat.ouT

5 5

0 7 8 1 4 5 2

3 4

2 4

3 1

4 2

P020006: Teren

Locuitorii din Dingilville caută un teren pentru construirea unui aeroport, având acces la harta regiunii. Această hartă are formă dreptunghiulară și este împărțită în pătrate având latura unitate. Fiecare pătrat se identifică printr-o pereche de coordonate (x,y), unde x este coordonata orizontală (vest-est), iar y este coordonata verticală (sud-nord). Pe hartă este indicată altitudinea fiecărui pătrat.

Găsiți o regiune dreptunghiulară de pătrate având aria cea mai mare (adică un teren dreptunghiular format din cel mai mare număr de pătrate) astfel încât:

a) cea mai mare diferență dintre pătratul cu cea mai mare altitudine și pătratul cu cea mai mică altitudine de pe teren este mai mic sau egal cu o valoare limită dată C;

b) lățimea (măsurată de-a lungul direcției vest-est) terenului este cel mult 100.

În cazul în care există mai multe terenuri ce satisfac cerințele problemei, se va afișa unul singur.

Restricții

- 1 Ł U Ł 700, 1 Ł V Ł 700, unde U și V reprezintă dimensiunile hărții. U reprezintă numărul pătratelor pe direcția vest-est, iar V reprezintă numărul pătratelor pe direcția sud-nord;

- 0 Ł C Ł 10;

- -30,000 Ł Hxy Ł 30,000, unde numărul întreg Hxy este altitudinea pătratului având coordonatele (x, y), 1 Ł x Ł U, 1 Ł y Ł V;

- colțul sud-vest al hărții are coordonatele (1,1) iar colțul nord-est are coordonatele (U,V).

Intrare

Numele fișierului de intrare este land.inp:

- pe prima linie se află trei numere întregi: U, V și C;

- fiecare din următoarele V linii conține numerele întregi Hxy pentru x = 1,...,U. Pe cea de-a (V-y+2)-a linie Hxy aparține celui de-al x-lea număr.

Ieșire

Fișierul de ieșire land.out va conține o linie pe care se vor scrie patru numere întregi, localizând terenul determinat: Xmin, Ymin, Xmax, Ymax, unde (Xmin , Ymin) sunt coordonatele pătratului din colțul sud-vest al terenului, iar (Xmax, Ymax) sunt coordonatele pătratului din colțul nord-est al terenului.

Exemplu

land.inP

10 15 4

41 40 41 38 39 39 40 42 40 40

39 40 43 40 36 37 35 39 42 42

44 41 39 40 38 40 41 38 35 37

38 38 33 39 36 37 32 36 38 40

39 40 39 39 39 40 40 41 43 41

39 40 41 38 39 38 39 39 39 42

36 39 39 39 39 40 39 41 40 41

31 37 36 41 41 40 39 41 40 40

40 40 40 42 41 40 39 39 39 39

42 40 44 40 38 40 39 39 37 41

41 41 40 39 39 40 41 40 39 40

47 45 49 43 43 41 41 40 39 42

42 41 41 39 40 39 42 40 42 42

41 44 49 43 46 41 42 41 42 42

45 40 42 42 46 42 44 40 42 41

land.out

4 5 8 11

[cuprins]