Olimpiada Republican A La a 2003 - Probleme Si Solutii

download Olimpiada Republican A La a 2003 - Probleme Si Solutii

of 64

Transcript of Olimpiada Republican A La a 2003 - Probleme Si Solutii

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    1/64

    MINISTERUL EDUCAIEI AL REPUBLICII MOLODOVA

    Academia de Studii Economice din Moldova

    Colegiul Republican de Informatic

    (EDIIA 2003)

    Chiinu, 2003

    Olimpiada Republicanla Informatic

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    2/64

    2

    Olimpiada Republican la Informatic. Ediia 2003. Chiinu: EdituraASEM, 2003. 64 p.

    Lucrarea conine problemele propuse la Olimpiada Republican laInformatic a elevilor, ediia 2003, i unele informaii despre Academia deStudii Economice din Moldova gazda Olimpiadei. Pentru toate problemele nlucrare sunt descrise i soluiile.

    Materialele Olimpiadei pot fi de un real folos la studierea informaticii attelevilor, ct i profesorilor de informatic, iar informaiile despre Academia deStudii Economice pot fi utile, de asemenea, elevilor, ndeosebi absolvenilor de

    coli i licee din Republica Moldova.

    Colegiul de redacie:

    Anatol Gremalschi, doctor habilitat, profesor universitar, UTMIon Bolun, doctor habilitat, profesor universitar, ASEMIurie Mocanu, Ministerul EducaieiDumitru Codreanu, Universitatea Tehnic, Bucureti.

    Editura ASEM, 2003.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    3/64

    3

    C U P R I N S

    Cuvnt nainte 5

    1. Ziua 1Clasele 7-9 8

    Calcule 9Cifru 11Domino 15

    Clasele 10-12 20

    Calcule 21Cifristul 23Domino 27

    2. Ziua 2Clasele 7-9 35

    Votul 36Metroul 40Roboii 45

    Clasele 10-12 48

    Votul 49Metroul 53Cina 59

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    4/64

    4

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    5/64

    5

    Dragi elevi,Dragi elevi,Dragi elevi,Dragi elevi,Dragi elevi,

    Stimai profesori,Stimai profesori,Stimai profesori,Stimai profesori,Stimai profesori,

    Informatica ne schimb viaa, uneori ntrInformatica ne schimb viaa, uneori ntrInformatica ne schimb viaa, uneori ntrInformatica ne schimb viaa, uneori ntrInformatica ne schimb viaa, uneori ntr -un mod-un mod-un mod-un mod-un modcu totul neateptat chiar i pentru cei iniiai n domeniu.cu totul neateptat chiar i pentru cei iniiai n domeniu.cu totul neateptat chiar i pentru cei iniiai n domeniu.cu totul neateptat chiar i pentru cei iniiai n domeniu.cu totul neateptat chiar i pentru cei iniiai n domeniu.PPPPPentru a stpni schimbarea, pentru a fi competitivi, pentruentru a stpni schimbarea, pentru a fi competitivi, pentruentru a stpni schimbarea, pentru a fi competitivi, pentruentru a stpni schimbarea, pentru a fi competitivi, pentruentru a stpni schimbarea, pentru a fi competitivi, pentrua beneficia din roadele acestei tiine, trebuie s cunoatema beneficia din roadele acestei tiine, trebuie s cunoatema beneficia din roadele acestei tiine, trebuie s cunoatema beneficia din roadele acestei tiine, trebuie s cunoatema beneficia din roadele acestei tiine, trebuie s cunoatemi s putem aplica ntregul arsenal de metode i tehnicii s putem aplica ntregul arsenal de metode i tehnicii s putem aplica ntregul arsenal de metode i tehnicii s putem aplica ntregul arsenal de metode i tehnicii s putem aplica ntregul arsenal de metode i tehniciinformaionale studiate n coal.informaionale studiate n coal.informaionale studiate n coal.informaionale studiate n coal.informaionale studiate n coal.

    Olimpiadele ROlimpiadele ROlimpiadele ROlimpiadele ROlimpiadele Republicane la Informatic au dreptepublicane la Informatic au dreptepublicane la Informatic au dreptepublicane la Informatic au dreptepublicane la Informatic au dreptscop suprem atragerea elevilor n competiii deschise iscop suprem atragerea elevilor n competiii deschise iscop suprem atragerea elevilor n competiii deschise iscop suprem atragerea elevilor n competiii deschise iscop suprem atragerea elevilor n competiii deschise ioneste, educarea culturii informaionale i a gndiriioneste, educarea culturii informaionale i a gndiriioneste, educarea culturii informaionale i a gndiriioneste, educarea culturii informaionale i a gndiriioneste, educarea culturii informaionale i a gndiriialgoritmice, focalizarea interesului public pe tehnologiilealgoritmice, focalizarea interesului public pe tehnologiilealgoritmice, focalizarea interesului public pe tehnologiilealgoritmice, focalizarea interesului public pe tehnologiilealgoritmice, focalizarea interesului public pe tehnologiilede vrfde vrfde vrfde vrfde vrf, atragerea tineretului studios n domeniile de, atragerea tineretului studios n domeniile de, atragerea tineretului studios n domeniile de, atragerea tineretului studios n domeniile de, atragerea tineretului studios n domeniile deperspectiv, att n tiin, ct i pe piaa muncii.perspectiv, att n tiin, ct i pe piaa muncii.perspectiv, att n tiin, ct i pe piaa muncii.perspectiv, att n tiin, ct i pe piaa muncii.perspectiv, att n tiin, ct i pe piaa muncii.

    Snt sigur c pe parcursul competiiilorSnt sigur c pe parcursul competiiilorSnt sigur c pe parcursul competiiilorSnt sigur c pe parcursul competiiilorSnt sigur c pe parcursul competiiilor, elevii i, elevii i, elevii i, elevii i, elevii iprofesorii au iniiat noi colaborprofesorii au iniiat noi colaborprofesorii au iniiat noi colaborprofesorii au iniiat noi colaborprofesorii au iniiat noi colaborri, au descoperit metoderi, au descoperit metoderi, au descoperit metoderi, au descoperit metoderi, au descoperit metodeoriginale de predare-nvare, au foriginale de predare-nvare, au foriginale de predare-nvare, au foriginale de predare-nvare, au foriginale de predare-nvare, au fcut un util schimb decut un util schimb decut un util schimb decut un util schimb decut un util schimb deexperien. Am ctigat noi cu toii, cei care iubim attexperien. Am ctigat noi cu toii, cei care iubim attexperien. Am ctigat noi cu toii, cei care iubim attexperien. Am ctigat noi cu toii, cei care iubim attexperien. Am ctigat noi cu toii, cei care iubim attde mult Informatica.de mult Informatica.de mult Informatica.de mult Informatica.de mult Informatica.

    Mulumim din suflet tuturor participanilor laMulumim din suflet tuturor participanilor laMulumim din suflet tuturor participanilor laMulumim din suflet tuturor participanilor laMulumim din suflet tuturor participanilor laOlimpiad pentru activismul manifestat i le dorim mariOlimpiad pentru activismul manifestat i le dorim mariOlimpiad pentru activismul manifestat i le dorim mariOlimpiad pentru activismul manifestat i le dorim mariOlimpiad pentru activismul manifestat i le dorim marisuccese n viitorsuccese n viitorsuccese n viitorsuccese n viitorsuccese n viitor.....

    n numele Consiliului Olimpic la Informatic,n numele Consiliului Olimpic la Informatic,n numele Consiliului Olimpic la Informatic,n numele Consiliului Olimpic la Informatic,n numele Consiliului Olimpic la Informatic,

    Anatol Gremalschi,doctor habilitat,

    profesor universitar, UTM

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    6/64

    6

    Instruciune

    I. Fiiere i directoare

    I.1. Dup terminarea lucrului, participantul va transmite oficialului numai fiierele sursale programelor, cte unul pentru fiecare problem.

    I.2. Fiierele surs vor avea acelai nume ca i fiierele de intrare/ieire. De exemplu ncazul fiierelor de intrare/ieire numite SORTARE.IN i SORTARE.OUT, fiierul sursse va numi SORTARE.PAS, SORTARE.C, sau SORTARE.CPP.

    I.3. Fiierele surs se vor afla ntr-un director cu numele format din primele 7 litere alenumelui de familie, plus prima liter a numelui. De exemplu pentru elevul TudorMrgineanu, directorul se va numi MARGINET. Pentru elevul Tudor Rou, directorul se

    va numi ROSUT. Denumirile de directoare snt indicate n fia de nregistrare.II. Intrri i ieiri

    II.1. Programul va citi i va scrie toate datele din fiierele text indicate, cu excepiacazurilor n care se indic altfel n enunul problemei.

    II.2. Fiierele de intrare/ieire vor fi citite/scrise n catalogul curent, evitndu-seintroducerea cilor absolute sau relative de acces. De exemplu, n cazul limbajului

    Pascali a fiierului SORTARE.IN se va utiliza apelul assign(f,sortare.in). Pentru unprogram n limbajul C se va utiliza apelul f=fopen(sortare.in,rt).

    II.3. Programul nu va scrie nimic pe ecran, nu va citi nimic de la tastatura, nu va lucra cualte fiiere, cu excepia cazurilor n care se indic altfel n enunul problemei.

    Ministerul Educaie al Republicii Moldova

    Olimpiada Republican la Informatic

    Chiinu 2003

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    7/64

    7

    III. Limbaje de programare

    III.1. Programul va utiliza numai mijloacele standard ale limbajului respectiv, evitndu-seincluderea codului Asamblor, codului de main, apelurilor de ntreruperi, scrierea nporturi, schimbarea timpului curent, scrierea direct n memorie, apelul altor programe,funcii ale sistemului de operare i altor posibiliti nestandard.

    III.2. Programul Pascal va utiliza numai unit-ul system care este ncrcat de compilatorautomat. Includerea altorunit-uri prin utilizarea clausei uses este interzis, cu excepiacazurilor special prevzute n enunul problemei.III.3. Soluiile competitorilor nu vor include nici un fel de directive de compilare carealtereaz opiunile prestabilite de compilare.

    III.4. Competitorilor le vor fi puse la dispoziie fiierele C_PAS.BAT, C_CPP.BAT care vorcompila soluiile lor cu exact aceleai opiuni ca i n cadrul evalurii. Mediile integratevor fi configurate pentru a reflecta ct mai precis opiunile de compilare din cadrulevalurii.

    IV. Alte restricii

    IV.1. Competitorul va lucra numai n mediul DOS oferit de organizatori, utiliznd

    programele DN, TP, TC. Utilizarea altor programe, inclusiv Windows este interzis.

    IV.2. n cazul nclcrii cerinelor de mai sus, participantul poate fi sancionat cu anularearezultatului pentru problema n cauz, pentru ziua respectiv, sau cu nlturarea de lacompetiie.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    8/64

    8

    Ziua 1

    Clasele 7-9

    Descrierea problemelor

    Denumireaproblemei

    Numrul de

    puncte alocatproblemei

    Denumireafiierului surs

    Denumirea

    fiierului deintrare

    Denumireafiierului de ieire

    Calcule 100CALCULE.PASCALCULE.CCALCULE.CPP

    CALCULE.IN CALCULE.OUT

    Cifru 100CIFRU.PASCIFRU.CCIFRU.CPP

    CIFRU.IN CIFRU.OUT

    Domino 100DOMINO.PASDOMINO.CDOMINO.CPP

    DOMINO.IN DOMINO.OUT

    Total 300 - - -

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    9/64

    9

    Calcule din antichitate

    Se presupune c unele din primele instrumente de calcul din antichitate au fost

    degetele de la propriile mini i beioarele de socotit. Din punctul de vedere al tiineimoderne, calculele cu ajutorul beioarelor de socotit pot fi descrise cu ajutorulurmtoarelor formule metalingvistice:

    := I

    := := +- :=

    Exemple:Numere ExpresiiI IIIIII II-IIIIIIIIIIIIII I+I-III+IIIIIII

    Elaborai un program care evalueaz astfel de expresii.

    Date de intrare.Fiierul text CALCULE.IN conine pe o singur linie un ir de caractere expresia supus evalurii.

    Date de ieire.Fiierul textCALCULE.OUTva conine pe o singur linie un numr ntreg zecimal

    rezultatul evalurii expresiei din fiierul de intrare.

    Exemplu.CALCULE.IN CALCULE.OUT

    I+I-III+IIIIIII 6

    Restricii.O expresie poate include cel mult 250 de caractere. Timpul de execuie nu vadepi 1 secund. Fiierul surs va avea denumirea CALCULE.PAS,CALCULE.C sau CALCULE.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    10/64

    10

    Rezolvare

    ProgramCalcule;{ Clasele 7-9 }var Expresie : string;

    Intrare, Iesire : text;

    function Evaluare(Expresie:string):integer;var v : integer; { valoarea curenta a expresiei}

    i : 1..256; { pozitia caracterului curentin expresie }

    Semn : char;beginv:=0;Semn:=+;

    for i:=1 to length(Expresie) do case Expresie[i] of

    I: if Semn=+ then v:=v+1 else v:=v-1;+: Semn:=+;-: Semn:=-;

    end;Evaluare:=v;

    end; { Evaluare }

    beginassign(Intrare, CALCULE.IN);reset(Intrare);readln(Intrare, Expresie);close(Intrare);assign(Iesire, CALCULE.OUT);rewrite(Iesire);writeln(Iesire, Evaluare(Expresie));close(Iesire);

    end.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    11/64

    11

    Cifru

    Pentru a pstra secretul corespondenei, informaticienii Vasilic i Petric au elaborat

    un algoritm de cifrare, care, n opinia lor, este foarte sigur. Mesajul ce trebuie cifratreprezint un ir de caractere imprimabile ale codului ASCII, far spaii, cu lungimean.Pentru a-l cifra, Vasilic folosete un ablon n form de tabel cu mrnduri, mn,numrul de coloane stabilindu-se n procesul cifrrii (vezi fig. 1). n fiecare celul atabelului poate fi nscris cte un singur caracter. Iniial toate celulele tabelului conin cteun spaiu.

    1 P G M E

    2 R R A

    m=3O A R

    Fig. 1.

    n procesul cifrrii, Vasilic nscrie mesajul iniial n tabel, cte un caracter n fiecarecelul, de sus n jos, pe coloane. Dup completarea primei coloane, se trece la coloanaa doua .a.m.d., pn cnd tot mesajul va fi nscris n tabel. Pentru exemplificare, ntabelul din figur este nscris mesajul PROGRAMARE. Dup completarea tabelului,Vasilic formeaz mesajul cifrat, copiind n acest scop coninutul tabelului, celul dupcelul, pe rnduri, rndurile tabelului fiind selectate ntr-o anumit ordine. Ordinea deexplorare a rndurilor din tabel reprezint cheia de descifrare, care se anexeaz lamesajul cifrat. De exemplu, n cazul tabelului din fig. 1 i cheia (2, 3, 1), rndurile vor fiexplorate n ordinea 2, 3 i 1, iar mesajul cifrat este

    RRA OAR PGME

    Primind cheia i mesajul cifrat, Petric completeaz un tabel similar, de data aceastape rnduri, de la stnga la dreapta, selectnd ordinea rndurilor conform cheiei dedescifrare. Dup completarea tabelului, Petric copie caracterele din celule, coloandup coloan, de sus n jos, obinnd astfel mesajul iniial.

    Elaborai un program care, cunoscnd cheia i mesajul cifrat, reconstituie mesajul iniial.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    12/64

    12

    Date de intrare.Fiierul text CIFRU.IN const din trei linii. Pe prima line este nscris numrulrndurilorm. Linia a doua a fiierului de intrare conine mnumere naturale cereprezint cheia cifrului. Linia a treia conine un ir de caractere - mesajul cifrat.

    Date de ieire.Fiierul textCIFRU.OUT va conine pe o singur linie mesajul descifrat.

    Exemplu.

    CIFRU.IN CIFRU.OUT3 PROGRAMARE

    2 3 1RRA OAR PGME

    Restricii.n 200. Timpul de execuie nu va depi 1 secund. Fiierul surs va aveadenumireaCIFRU.PAS, CIFRU.C sau CIFRU.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    13/64

    13

    Rezolvare

    Program Cifru;var n,m,t:longint;

    A:array[0..400] of char;B:array[0..200,0..200] of char;r:array[0..400] of integer;Result:array[0..400] of char;num:integer;

    procedure Citire;

    var f:text;i:integer;

    beginassign(f,cifru.in); reset(f);readln(f,m);for i:=1 to m do read(f,r[i]); readln(f);while not(eoln(f)) do begin t:=t+1;read(f,A[t]);

    end;

    n:=t div m;close(f);end;

    procedure Decodificare;var k,i,j:integer;begink:=1;for i:=1 to m do

    beginfor j:=1 to n do begin B[r[i],j]:=A[k];inc(k);

    end;end;

    num:=0;for j:=1 to n dofor i:=1 to m do

    begin num:=num+1; Result[num]:=B[i,j]; end;while Result[num]= do dec(num);

    end;

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    14/64

    14

    procedure Afisare;var i,j:integer;

    f:text;beginassign(f,cifru.out); rewrite(f);for i:=1 to num do write(f,Result[i]);writeln(f);close(f);

    end;

    begin

    Citire;Decodificare;Afisare;End.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    15/64

    15

    Domino

    n jocul Domino se utilizeaz 28 de piese distincte plate, dreptunghiulare. Fiecare pies

    se identific prin dou numere, simbolizate prin puncte (figura 1). nsemnarea acestornumere pe fiecare plac se efectueaz prin divizarea feei respective n dou priegale, fiecare numr fiind din mulimea {0, 1, 2, 3, 4, 5, 6}.

    Fig. 1 Fig. 2

    Utilizndnpiese distincte de domino n calitate de vagoane imaginare, pe mas dejoc se construiete un tren ( fig. 2a). Trenul construit se numete tren perfect daccele dou numere de pe prile vecine ale oricror dou piese adiacente snt egale ntreele (fig. 2b). n unele cazuri, un tren obinuit poate fi transformat n unul perfect prin

    rotaia cu 180 a anumitor piese. De exemplu, trenul perfect din fig. 2b poate fi obinutdin trenul obinuit din fig. 2a prin rotaia celor dou piese indicate cu sgeat.

    Elaborai un program care transform, daca-i posibil, un tren obinuit n unul perfect.

    Date de intrare.Fiierul textDOMINO.IN conine pe prima linie numrul de piese n. Urmtoarelen linii ale fiierului de intrare conin cte dou numere ntregi separate prin spaiu,

    fiecare linie reprezentnd o pies de domino. Piesele snt listate n ordinea apariieilor n tren.

    Date de ieire.Fiierul textDOMINO.OUT va conine pe prima linie cuvntul DA dac trenul dinfiierul de intrare poate fi transformat n unul perfect i NU n caz contrar. n cazulrspunsului DA, urmtoarele n linii ale fiierului de ieire vor conine cte dounumere ntregi separate prin spaiu, fiecare linie reprezentnd o pies de domino.Piesele vor fi listate n ordinea apariiei lor n fiierul de intrare, astfel nct cele dou

    numere de pe prile vecine ale oricror dou piese adiacente s fie egale ntre ele.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    16/64

    16

    Exemplu.DOMINO.IN DOMINO.OUT

    4 DA2 1 1 22 6 2 65 6 6 55 4 5 4

    Restricii.1 n 28. Timpul de execuie nu va depi 1 secund. Fiierul surs va aveadenumirea DOMINO.PAS, DOMINO.C sau DOMINO.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    17/64

    17

    Rezolvare

    Vom identifica piesele trenului prin perechile ordonate (ai, b

    i), i= 1, 2, ..., n. Evident,

    operaia de rotire a piesei ipoate fi redat prin notaia (ai, bi) (bi, ai).Presupunem c trenul iniial poate fi transformat n unul perfect. n aceste condiii snt

    posibile urmtoarele cazuri:a) piesa i= 1 i-a pstrat poziia iniial (a

    i, b

    i);

    b) piesa i= 1 a fost rotit, avnd n trenul perfect poziia (bi, a

    i).

    n continuare, vom ncerca s construim trenul perfect pentru cazurile a) i b) separat,rotind, n caz de necesitate, piesele 2, 3, ..., n.

    Admitem, c n procesul examinrii consecutive a pieselor din componena trenului,piesele i=1, 2, ..., k1 i-au ocupat deja poziia lor corect i se examineaz piesa k.

    Evident, snt posibile urmtoarele cazuri:1) b

    k-1= a

    k. Evident, piesa kocup poziia corect. Se trece la piesa k+ 1.

    2) bk-1

    = bk. n acest caz piesa ktrebuie rotit: (a

    k, b

    k) (b

    k, a

    k). n continuare se

    trece la piesa k+ 1.3) b

    k-1 ak, bk-1 bk. Evident, trenul nu poate fi transformat n unul perfect. Stop.Accentum, c piesa k 1, care se afl naintea piesei curente k, nu mai poate fi

    rotit, ntruct poziia ei este determinat de poziia piesei k 2, poziia creia, la rndulei, este determinat de poziia piesei k 3 .a.m.d., pn la piesa 1.

    n programul ce urmeaz, fiecare pies de domino este reprezentat cu ajutorul tipuluide date

    Piesa = recorda, b : 0..6;

    end;

    iar trenul T - cu ajutorul variabilei

    T : array[1..28] of Piesa;

    Evident, algoritmul care verific condiiile1) 3) i rotete, n caz de necesitate,piesele respective, poate fi realizat printr-o singur parcurgere a tabloului T.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    18/64

    18

    ProgramDomino;{ Clasele 7-9 }

    type Piesa = record

    a, b : 0..6; end;var T : array[1..28] of Piesa; { trenul }

    n : 1..28; { numarul de vagoane in tren }Perfect : boolean;c : integer; { variabila de lucru }

    procedure Citeste;{ Citirea datelor din fisierul de intrare }

    var i : integer;Intrare : text;

    beginassign(Intrare, DOMINO.IN);reset(Intrare);readln(Intrare, n);

    for i:=1 to n doreadln(Intrare, T[i].a, T[i].b);

    close(Intrare);

    end; { Citeste }

    procedure Scrie;{ Scrierea datelor in fisierul de iesire }

    var i : integer;Iesire : text;

    beginassign(Iesire, DOMINO.OUT);rewrite(Iesire);

    ifnot Perfect then writeln(Iesire, NU) elsebegin

    writeln(Iesire, DA);for i:=1 to n dowriteln(Iesire, T[i].a, , T[i].b);

    end; { else }close(Iesire);

    end; { Scrie }

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    19/64

    19

    procedure Transforma;var j, k : integer;begin

    Perfect:=true;k:=2;

    while ((k

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    20/64

    20

    Ziua 1

    Clasele 10 - 12

    Descrierea problemelor

    Denumireaproblemei

    Numrul depuncte alocat

    problemei

    Denumireafiierului surs

    Denumireafiierului de

    intrare

    Denumireafiierului de

    ieire

    Calcule 100CALCULE.PAS

    CALCULE.C

    CALCULE.CPP

    CALCULE.IN CALCULE.OUT

    Cifristul 100CIFRIST.PAS

    CIFRIST.C

    CIFRIST.CPP

    CIFRIST.IN CIFRIST.OUT

    Domino 100DOMINO.PAS

    DOMINO.C

    DOMINO.CPP

    DOMINO.IN DOMINO.OUT

    Total 300 - - -

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    21/64

    21

    Calcule din antichitate

    Se presupune c unele din primele instrumente de calcul din antichitate au fost

    degetele de la propriile mini i beioarele de socotit. Din punctul de vedere al tiineimoderne, calculele cu ajutorul beioarelor de socotit pot fi descrise cu ajutorulurmtoarelor formule metalingvistice:

    := I := := +- :=

    Exemple:Numere ExpresiiI IIIIII II-IIIIIIIIIIIIII I+I-III+IIIIIII

    Elaborai un program care evalueaz astfel de expresii.

    Date de intrare.Fiierul text CALCULE.IN conine pe o singur linie un ir de caractere expresia supus evalurii.

    Date de ieire.Fiierul textCALCULE.OUTva conine pe o singur linie un numr ntreg zecimal

    rezultatul evalurii expresiei din fiierul de intrare.

    Exemplu.CALCULE.IN CALCULE.OUT

    I+I-III+IIIIIII 6

    Restricii.O expresie poate include cel mult 32000 de caractere. Timpul de execuie nu vadepi 1 secund. Fiierul surs va avea denumirea CALCULE.PAS,CALCULE.C sau CALCULE.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    22/64

    22

    Rezolvare

    ProgramCalcule; { Clasele 10-12 }

    var Expresie : array [1..32000] of char;n : 0..32000; {numarul de caractere in Expresie}Intrare, Iesire : text;

    function Evaluare : integer;var v : integer; { valoarea curenta a expresiei }

    i : 1..32000; { pozitia caracterului curent inexpresie }

    Semn : char;beginv:=0;Semn:=+;

    for i:=1 to n do case Expresie[i] of

    I: if Semn=+ then v:=v+1 else v:=v-1;+: Semn:=+;-: Semn:=-;

    end;Evaluare:=v;

    end; { Evaluare }

    beginassign(Intrare, CALCULE.IN);reset(Intrare);n:=0;

    whilenot Eoln(Intrare) do

    beginn:=n+1;read(Intrare, Expresie[n]);

    end;close(Intrare);assign(Iesire, CALCULE.OUT);rewrite(Iesire);writeln(Iesire, Evaluare);close(Iesire);

    end.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    23/64

    23

    Cifristul

    Cifristul este un informatician care i cifreaz datele chiar i n cazurile cnd acest

    lucru nu este necesar. Mai mult chiar, fiind distrat, el permanent uit parolele, algoritmiide descifrare, cheile cifrului .a.m.d. Ultima lui invenie reprezint urmtorul algoritm decifrare a mesajelor.

    Mesajul iniial reprezint un ir de caractere imprimabile ale codului ASCII, farspaii, cu lungimea n. Pentru a cifra acest mesaj, cifristul folosete un ablon n formde tabel cu mrnduri, mn, numrul de coloane stabilindu-se n procesul cifrrii (vezifig. 1). n fiecare celul a tabelului poate fi nscris cte un singur caracter. Iniial toatecelulele tabelului conin cte un spaiu.

    1 P G M E

    2 R R A

    m=3 O A R

    Fig. 1.

    Mesajul iniial se nscrie n tabel, cte un caracter n fiecare celul, de sus n jos, pe

    coloane. Dup completarea primei coloane, se trece la coloana a doua .a.m.d., pncnd tot mesajul va fi nscris n tabel. Pentru exemplificare, n tabelul din figur este nscris mesajulPROGRAMARE. Dup completarea tabelului, se compune mesajulcifrat, copiind n acest scop coninutul tabelului, celul dup celul, de la stnga ladreapta, rndurile tabelului fiind citite de sus n jos. De exemplu, n cazul tabelului dinfig. 1 mesajul cifrat este

    PGMERRA OAR

    iar numrul m= 3 este cheia cifrului.

    Pentru a descifra mesajul, cunoscnd cheiam, se construiete un tabel cumrnduri,n celulele cruia se nscrie mesajul cifrat, de data aceasta pe rnduri, de la stnga ladreapta, de sus n jos. Dup completarea tabelului, mesajul iniial este reconstituitcopiind caracterele din celule, de sus n jos, coloan dup coloan, de la stnga ladreapta.

    Fiind distrat, cifristul permanent uit cheia cifrului, prin alte cuvinte, numrul dernduri mi nu mai are acces la propriile date.

    Elaborai un program care, cunoscnd mesajul iniial i mesajul cifrat, calculeaz

    cheia cifruluim.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    24/64

    24

    Date de intrare.Fiierul textCIFRIST.IN const din dou linii. Pe prima linie este nscris un irde caractere - mesajul iniial, iar pe a doua un alt ir de caractere - mesajul cifrat.

    Date de ieire.Fiierul textCIFRIST.OUT va conine pe o singur linie cheia cifrului - numrulnatural m.

    Exemplu.

    CIFRIST.IN CIFRIST.OUT

    PROGRAMARE 3PGMERRA OAR

    Restricii.n 200. Timpul de execuie nu va depi 2 secunde. Fiierul surs va aveadenumireaCIFRIST.PAS, CIFRIST.C sau CIFRIST.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    25/64

    25

    Rezolvare

    ProgramCifristul;

    var s,cifr:array[0..400] of char;l,m,n:integer;

    procedure Citire;var f:text;

    i:integer;c:char;n1:integer;

    beginn1:=0;

    assign(f,cifrist.in); reset(f);while not eoln(f) do begin read(f,c);inc(n1);s[n1]:=c; end;readln(f);l:=0;while not eoln(f) do

    beginread(f,c); inc(l);cifr[l]:=c;

    end;for i:=n1+1 to l do s[i]:= ;

    close(f);end;

    procedure Decodificare;var i,j:integer; ok:boolean;beginm:=0;repeat m:=m+1;

    ok:=false;if (l mod m)0 then continue;ok:=true; n:=l div m;for i:=1 to m do

    beginfor j:=1 to n do

    beginif s[(j-1)*m+i]cifr[(i-1)*n+j] thenok:=false;

    if not(ok) then break; end;

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    26/64

    26

    if not(ok) then break;end;

    if m>l then break;until ok;

    end;

    procedure Afisare;var i,j:integer;

    f:text;beginassign(f,Cifrist.out); rewrite(f);writeln(f,m);

    close(f);end;

    beginCitire;Decodificare;

    Afisare;End.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    27/64

    27

    Domino

    n jocul Domino se utilizeaz 28 de piese distincte plate, dreptunghiulare. Fiecare

    pies se identific prin dou numere, simbolizate prin puncte (figura 1). nsemnareaacestor numere pe fiecare plac se efectueaz prin divizarea feei respective n doupri egale, fiecare numr fiind din mulimea {0, 1, 2, 3, 4, 5, 6}.

    Utilizndnpiese distinctede domino n calitate de vagoane imaginare, pe masa dejoc poate fi construit un tren cu proprietatea ca cele dou numere de pe prile vecineale oricror dou piese adiacente snt egale ntre ele (figura 2). Lungimea trenului sedefinete prin numrul de piese mdin componena lui. Evident, mn.

    Elaborai un program care calculeaz numrul de plci ntr-un tren de lungimemaxim, ce poate fi construit din n plci distincte de domino.

    Date de intrare.Fiierul textDOMINO.IN conine pe prima linie numrul de piesen. Urmtoarelen linii ale fiierului de intrare conin cte dou numere ntregi separate prin spaiu,fiecare linie reprezentnd o pies de domino.

    Date de ieire.Fiierul text DOMINO.OUT va conine pe prima linie numrul de piese mntr-untren de lungime maxim. Urmtoarelemlinii ale fiierului de ieire vor conine ctedou numere ntregi separate prin spaiu, fiecare linie reprezentnd o pies dedomino. Piesele vor fi listate n ordinea apariiei lor n tren, astfel nct cele dounumere de pe prile vecine ale oricror dou piese adiacente snt egale ntre ele.

    Fig. 1 Fig. 2

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    28/64

    28

    Exemplu.

    DOMINO.IN DOMINO.OUT

    4 33 6 0 33 5 3 63 0 6 66 6

    Restricii.

    1n

    10. Timpul de execuie nu va depi 5 secunde. Fiierul surs va aveadenumireaDOMINO.PAS, DOMINO.C sau DOMINO.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    29/64

    29

    Rezolvare

    Pentru a calcula numrul de piese din componena unui tren de lungime maxim,

    vom examina consecutiv toate trenurile posibile ce pot fi construite din piesele date. nacest scop vom simula pe calculator aciunile juctorului n domino. Introducem nstudiu dou mulimi ordonate:

    C0 - mulimea pieselor disponibile;X- trenul n curs de construcie.

    Se observ c mulimeaXpoate fi construit pas cu pas, alegnd din mulimeapieselor disponibile cte una care satisface condiiile problemei:

    1) Iniial includem n mulimeaXprima pies din mulimea C0: X:= (x1). Evident,aceast pies trebuie exclus din mulimea pieselor disponibile: C1 := C0 \ {x1}.

    2) Alegem din mulimea pieselor rmase C1 prima pies care satisface condiiileproblemei i stabilim:X:= (x1,x2); C2 := C1 \ {x2}.

    3) Presupunem c acest proces a ajuns la pasul k, n mulimeaXfiind deja inclusek-1 piese:

    X= (x1,x2, ...,xk-1).

    n continuare snt posibile urmtoarele cazuri:A) n mulimea pieselor rmase C

    k-1mai exist piese care satisfac condiiile

    problemei. n astfel de cazuri stabilimX:= (x

    1,x

    2, ...,x

    k-1,x

    k), C

    k:= C

    k-1\ {x

    k}

    i continum calculele.B) n mulimea C

    k-1nu mai exist piese care satisfac condiiile problemei. Evident,

    am obinut un tren la care nu mai putem ataa alte vagoane. Memorm lungimeaacestui tren i revenim la pasul precedent, unde ncercm s alegem dinmulimea C

    k-2alt piesex

    k-1. Dac n mulimea C

    k-2astfel de piese nu mai exist,

    revenim la mulimea Ck-3

    .a.m.d.

    Evident, algoritmul care simuleaz aciunile juctorului poate fi realizat prin metodarelurii, utiliznd n acest scop recursia.n programul ce urmeaz, fiecare pies de domino este reprezentat cu ajutorul

    tipului de datePiesa = record

    a, b : 0..6;end;

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    30/64

    30

    iar mulimile C i X - cu ajutorul structurilor

    MultimePiese = recordk : integer;

    p : array[1..28] of Piesa;end;

    Tren=MultimePiese;

    Metoda relurii este realizat n procedura cu acelai nume, iar trenul de lungimemaxim este memorat n variabila Xmax.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    31/64

    31

    ProgramDomino; { Clasele 10-12 }type Piesa=record

    a, b : 0..6;

    end;MultimePiese=record

    k : integer;p : array[1..28] of Piesa;

    end;Tren=MultimePiese;

    var n : integer;C : MultimePiese;X, Xmax : Tren;

    procedure Citeste(var C : MultimePiese;var n : integer);

    { Citirea datelor din fisierul de intrare }var i : integer;

    Intrare : text;begin

    assign(Intrare, DOMINO.IN);

    reset(Intrare);readln(Intrare, n);C.k:=n;

    for i:=1 to n doreadln(Intrare, C.p[i].a, C.p[i].b);

    close(Intrare);end; { Citeste }

    procedure Scrie(X : Tren);

    { Scrierea datelor in fisierul de iesire }var i : integer;

    Iesire : text;begin

    assign(Iesire, DOMINO.OUT);rewrite(Iesire);writeln(Iesire, X.k);for i:=1 to X.k do

    writeln(Iesire, X.p[i].a, , X.p[i].b);

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    32/64

    32

    close(Iesire);end; { Scrie }

    procedure AdaugaVagonul(var X : Tren; Q : Piesa);{ Adauga vagonul Q la trenul X }

    beginX.k:=X.k+1;X.p[X.k]:=Q;

    end;

    procedure ScoateVagonul(var X : Tren);

    { Scoate din trenul X ultimul vagon }begin

    X.k:=X.k-1;end; { ScoateVagonul}

    procedure ExcludePiesa(var Z : MultimePiese;i : integer);

    { Exclude din multimea Z piesa i }var j : integer;

    beginfor j:=i to Z.k-1 do Z.p[j]:=Z.p[j+1];Z.k:=Z.k-1;

    end; { ExcludePiesa }

    function Corespunde(X : MultimePiese; var Q : Piesa): boolean;

    { Returneaza TRUE daca vagonul Q poate fi atasat latrenul X }

    { In caz de necesitate, roteste piesa Q }label 1;var i : integer;begin if X.k=0 then begin

    Corespunde:=true; goto 1;

    end; { if }

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    33/64

    33

    Corespunde:=false;{ pozitia initiala a placii Q }

    if X.p[X.k].b=Q.a then

    beginCorespunde:=true;

    goto 1; end; if X.p[X.k].b=Q.b then

    { rotim placa Q } begin

    Corespunde:=true;i:=Q.a;

    Q.a:=Q.b;Q.b:=i;

    end;1: end; { Corespunde }

    procedure Reluare(C : MultimePiese; var X : Tren);var C1 : MultimePiese;

    Q : Piesa;i : integer;

    beginfor i:=1 to C.k do

    beginQ:=C.p[i];

    if Corespunde(X, Q) then begin

    AdaugaVagonul(X, Q); if X.k>Xmax.k then Xmax:=X;

    C1:=C;ExcludePiesa(C1, i);Reluare(C1, X);ScoateVagonul(X);

    end; { if } end; { for }end; { Reluare }

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    34/64

    34

    procedure TrenMaxim(C : MultimePiese; X :Tren);{ Cauta trenul de lungime maxima }var i, j : integer;

    Xmax : Tren;begin

    Xmax.k:=0;X.k:=0;Reluare(C, X);{ rotim piesele cu care poate incepe trenul }

    for i:=1 to C.k do begin

    j:=C.p[i].b; C.p[i].b:=C.p[i].a; C.p[i].a:=j; end;X.k:=0;Reluare(C, X);

    end; { Tren }

    beginCiteste(C, n);TrenMaxim(C, X);

    Scrie(Xmax);end.

    Complexitatea temporal a programului Domino poate fi estimat lund nconsideraie faptul c numrul permutrilor posibile ale unei mulimi Ccu n elemente sedetermin ca P

    n= n!. Conform restriciilor problemei, n = 10, deci P! 4 106, mrime

    care este de acelai ordin ca i capacitatea de prelucrare a calculatoarelor personale.Prin urmare, timpul de execuie va fi de ordinul unei scunde. ntruct n metoda reluriinu se examineaz n mod obligatoriu toate permutrile posibile, timpul de execuie al

    programului Domino va fi cu mult mai mic.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    35/64

    35

    Ziua 2

    Clasele 7-9

    Descrierea problemelor

    Denumireaproblemei

    Numrul depuncte alocat

    problemei

    Denumireafiierului surs

    Denumireafiierului de

    intrare

    Denumireafiierului de

    ieire

    Votul 100VOT.PASVOT.CVOT.CPP

    VOT.IN VOT.OUT

    Metroul 100METROU.PASMETROU.CMETROU.CPP

    METROU.IN METROU.OUT

    Roboi 100ROBOTI.PASROBOTI.CROBOTI.CPP

    ROBOTI.IN ROBOTI.OUT

    Total 300 - - -

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    36/64

    36

    Votul

    La nceputuri, pe o insul foarte ndeprtat, toate deciziile se adoptau la adunarea

    general a alegtorilor prin majoritate de voturi. Odat cu creterea numrului dealegtori, convocarea adunrilor generale a devenit practic imposibil. Pentru a nubloca procesul de adoptare a deciziilor s-a convenit ca insula s fie mprit ncircumscripii electorale, nu neaprat cu acelai numr de alegtori, iar orice proiect dedecizie s fie supus votului n fiecare circumscripie separat. Decizia se consideradoptat ntr-o circumscripie, dac pentru ea au votat mai mult de jumtate din alegtoriidin circumscripia respectiv. Decizia se consider adoptat pentru ntreaga insuldac ea a fost aprobat n mai mult din jumtate din numrul circumscripiilor.

    Evident, dac n cazul adunrilor generale deciziile se considerau adoptate numaiatunci cnd pentru ele votau majoritatea alegtorilor de pe ntreaga insul, n cazulcircumscripiilor acest lucru nu mai este necesar.

    De exemplu, presupunem c pe insul locuiesc 17 alegtori. n cazul adunrilorgenerale, pentru a aproba o decizie snt necesare 9 voturi pro. Daca ns formm 3circumscripii, i anume, prima cu 4, a doua cu 6 i a treia circumscripie cu 7 alegtori,pentru adoptarea unei decizii este suficient ca ea s fie votat n cel puin dou

    circumscripii, numrul necesar de voturi fiind 7.Scriei un program care, cunoscnd numrul de circumscripii i numrul de alegtori

    din fiecare circumscripie, calculeaz numrul de voturi, necesare pentru adoptareaunei decizii pentru ntreaga insul.

    Date de intrare.Fiierul text VOT.IN const din dou linii. Pe prima line este nscris numrulcircumscripiilorn. Linia a doua a fiierului de intrare conine n numere ntregi

    pozitive ce reprezint numrul alegtorilor din fiecare circumscripie.

    Date de ieire.Fiierul text VOT.OUT va conine pe o singur linie un numr natural - numrulnecesar de voturi.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    37/64

    37

    Exemplu.VOT.IN VOT.OUT3 74 6 7

    Restricii.n 1000. Numrul de alegtori pe insul nu depete valoarea 30000.Timpul de execuie nu va depi 1 secund. Fiierul surs va avea denumireaVOT.PAS, VOT.C sau VOT.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    38/64

    38

    Rezolvare

    Reprezentm numrul de alegtori din fiecare circumscripie n forma unui vector

    (tablou) A= (a1, a

    2, a

    3, ..., a

    n),

    elementele cruia snt sortate n ordine cresctoare:

    a1a

    2a

    3 ... a

    n.

    Se observ c numrul minim de voturi m, necesare pentru adoptarea unei deciziipoate fi determinat ca

    m= (a1div 2 +1) + (a

    2div 2 +1) +

    +(a3div 2 +1) + ...(a

    kdiv 2 + 1),

    unde k= (ndiv 2) +1.

    ProgramVotul;{ Clasele 7-9 }

    var A:array[1..1000] of integer;n:integer;vots:longint;

    procedure InitData;{ Citirea datelor de intrare }

    var f:text; i:integer;begin

    assign(f,vot.in); reset(f);

    readln(f,n); for i:=1 to n do read(f,A[i]);

    close(f);end; { InitData }

    procedure BubleSort;{Sortarea vectorului A prin metoda bulelor }

    var i,k,l,t:integer;begin

    l:=n-1;

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    39/64

    39

    while 1A[i+1] then begin

    t:=A[i]; A[i]:=A[i+1]; A[i+1]:=t;k:=i;

    end;l:=k-1;

    end;end; { BubleSort }

    procedure Calc;{ Calcularea numarului minim de alegatori }

    var i:integer;begin for i:=1 to (n div 2) +1 do

    vots:=vots+((A[i] div 1)+1);end; { Calc }

    procedure Outputdata;{ Extragerea datelor de iesire }var f:text;beginassign(f,vot.out);rewrite(f); writeln(f,vots);close(f);

    end; { Outputdata }

    beginInitData;BubleSort;Calc;OutputData;

    end.

    Din analiza procedurilorBubleSort iCalc se observ ca numrul de operaiinecesare pentru sortarea componentelor vectorului A este proporional cu n2. Evident,

    pentru n 1000, timpul de execuie nu va depi o secund.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    40/64

    40

    Metroul

    Metroul din Londra reprezint un sistem complex, care transport zilnic milioane de

    pasageri (fig. 1). Din punctul de vedere al pasagerului, metroul poate fi tratat ca omulime de linii de tren i o mulime de staii. n scopuri didactice, vom nota liniile de trenprin literele mariA, B, C, D .a.m.d. ale alfabetului latin, n total n linii, iar staiile - prinnumerele naturale 1, 2, 3, ..., n total mstaii (fig. 2).

    Fig. 1 Fig. 2

    Liniile de tren i staiile respective au fost proiectate n aa fel, nct pasagerul, carepleac din orice staiex, s poat ajunge n oricare alt staie y. Evident, n cazurile ncare staiile se afl pe linii diferite, pasagerul este nevoit s fac una sau mai multetransbordri, schimbnd trenul n staiile n care se ntlnesc dou sau mai multe linii detren. De exemplu, pentru a ajunge din staia 1 n staia 8 (fig. 2), pasagerul poate sfac o singur transbordare n staia 2 sau dou transbordri - prima n staia 4 i adoua n staia 6.

    n caz de reparaii, unele staii de metrou pot fi temporar nchise pentru transbordareapasagerilor. n astfel de cazuri, nu ntotdeauna pasagerul care pleac din staiax, poates ajunge n oricare alt staie y. De exemplu, dac staia 5 va fi nchis pentru

    transbordri (fig. 2), pasagerii care pleac din staia 1 nu mai pot ajunge n staia 9. Unalt exemplu poate servi nchiderea staiei 2, care ns, nu mpiedic pasagerii ce pleacdin staia 1 s ajung n oricare alt staie de metrou.

    Elaborai un program, care, cunoscnd planul metroului, staia de plecarex, staiade sosire yi staia nchis z, determin dac pasagerul poate ajunge din xn y.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    41/64

    41

    Date de intrare.Fiierul text METROU.IN conine pe prima linie numerele naturale n, m, x,y, z separate prin spaiu. Fiecare din urmtoarele n linii ale fiierului coninenumere de staii separate prin spaiu. Linia a 2-a a fiierului de intrare coninenumerele de staii ale liniei de tren A, linia a treia a fiierului de intrare coninenumerele de staii ale liniei de tren B .a.m.d.

    Date de ieire.Fiierul textMETROU.OUT va conine pe o singur linie cuvntul DA dac pasagerulpoate ajunge din staia xn staia yi NU n caz contrar.

    Exemplu.

    METROU.IN METROU.OUT

    4 9 1 8 2 DA1 2 3 4 52 6 87 6 45 9

    Restricii.

    2 n 26, 3 m 250, xy, xz, yz. Timpulde execuie nu va depi 5 secunde. Fiierul surs va avea denumireaMETROU.PAS, METROU.C sau METROU.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    42/64

    42

    Rezolvare

    Introducem n studiu mulimile L1, L2, ..., Ln, fiecare mulime reprezentnd cte o linie

    de tren. De exemplu, n cazul fig. 2, avem:L1 = {1, 2, 3, 4, 5} - liniaA;L2 = { 2, 6, 8} - linia B;L3 = {7, 6, 4} - linia C;L4 = { 5, 9} - linia D.

    Fie S mulimea staiilor de metrou la care se poate ajunge pornind din staia x.Aceast mulime poate fi calculat iterativ dup cum urmeaz:

    1) Iniial includem n mulimea S0 toate staiile de pe liniile pe care apare staiax.

    2) Presupunem c la un anumit pas kavem deja calculat mulimea Sk-1. MulimeaS

    kse obine adugnd la mulimea S

    k-1toate staiile de pe liniile pe care apare cel

    puin o staie din mulimea Sk-1

    . Evident, S0 S1 S2 ... Sk, iar nmulimile S0, S1, S2, ..., Sk nu trebuie s apar staia z, care este nchis pentrutransbordri.

    3) Indiferent de configuraia liniilor de metrou, numrul necesar de transbordrinu poate depi valoarea n-1. Prin urmare, mulimile S

    ktrebuie calculate pentru

    k= 1, 2, 3 .a.m.d, n cel mai nefavorabil caz, pn la k= n-1.

    Pe calculator mulimile S0, S1, S2, ..., Sk pot fi reprezentate cu ajutorul unui singur

    vector (tablou)mj

    tT= , denumit vectorul staiilor accesibile. La fiecare pas k,

    componentele tjale acestui vector au urmtoarea semnificaie:

    =contrar.cazin,0

    ;multimiiapartinestatiadaca,1 kij

    Sjt

    n programul ce urmeaz liniile de tren i vectorul staiilor accesibile snt reprezentateprin structurile de dateconst nmax=26;

    mmax=250;type Linie = setof 1..mmax;var L : array [1..26] of Linie;

    n : 2..nmax;m, x, y, z : 3..mmax;T : array[1..mmax] of boolean;

    iar apartenena staiilor la anumite linii de metrou se verific cu ajutorul operatoruluiin.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    43/64

    43

    ProgramMetro;{ Clasele 7-9 }

    const nmax=26;

    mmax=250;type Linie = setof 1..mmax;var L : array [1..26] of Linie;

    n : 2..nmax;m, x, y, z : 3..mmax;T : array[1..mmax] of boolean;

    procedure Citeste;

    { Citirea datelor de intrare }var i, j : integer;Intrare : text;

    beginassign(Intrare, METRO.IN);reset(Intrare);readln(Intrare, n, m, x, y, z);

    for i:=1 to n do begin

    L[i]:=[]; whilenot eoln(Intrare) do begin

    read(Intrare, j);L[i]:=L[i]+[j];

    end; { while }readln(Intrare);

    end; { for }close(Intrare);

    end; { Citeste }

    procedure Scrie;{ Scrierea datelor in fisierul de iesire }

    var i, j, k : integer;Iesire : text;

    beginassign(Iesire, METRO.OUT);rewrite(Iesire);

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    44/64

    44

    if T[y] then writeln(Iesire, DA) else Writeln(Iesire, NU);

    close(Iesire);end; { Scrie }

    procedure Accesibilitate;{ Calculeaza vectorul T }

    var i, j, k, q : integer;begin{excludem statia z din toate liniile de metrou}

    for i:=1 to n do if (z in L[i]) then L[i]:=L[i]-[z];

    { initializam vectorul T } for j:=1 to m do T[j]:=false;{ calculam multimea S0 }

    for i:=1 to n do if (x in L[i]) then for j:=1 to m do if (j in L[i]) then T[j]:=true;

    { calculam multimile Sk } for k:=1 to n-1 do

    for i:=1 to n do for j:=1 to m do if ((j in L[i]) and T[j]) then for q:=1 to m do if (q in L[i]) then T[q]:=true;end; { Accesibilitate }

    beginCiteste;

    Accesibilitate;Scrie;

    end.

    Din analiza proceduriiAccesibilitate se observ c instruciunea

    if (q in L[i]) then T[q]:=true

    din interiorul celor patru cicluri imbricate se va efectua de cel mult n(n-1)m2 ori.Conform restriciilor problemei, n 26 i m 250. Prin urmare, n cazul cel mai

    nefavorabil, numrul necesar de operaii este de ordinul 108, mrime comparabil cucapacitatea de prelucrare a calculatoarelor personale.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    45/64

    45

    Roboi

    O populaie de roboi se dezvolt conform urmtoarelor legi:

    a) o dat n an roboii se adun n grupe de cte 3 sau 5 indivizi n aa mod nctnumrul grupelor de cte 3 indivizi este maxim;

    b) fiecare grup de cte 3 roboi asambleaz ali 5 roboi noi, iar fiecare grup decte 5 roboi asambleaz ali 9 roboi noi;

    c) dup ce a fost asamblat, fiecare robot triete exact 3 ani.

    Presupunem, c iniial populaia este format din k0 roboi noi-noui. Elaborai unprogram, care calculeaz numrul de roboi k

    nn populaie peste n ani.

    Date de intrare.Fiierul text ROBOTI.IN conine pe o singur linie numerele naturale k0 i nseparate prin spaiu.

    Date de ieire.Fiierul text ROBOTI.OUT va conine pe o singur linie numrul natural k

    n.

    Exemplu.

    ROBOTI.IN ROBOTI.OUT8 2 60

    Restricii.7 < k0 25, 1 n 19. Timpul de execuie nu va depi 1 secund. Fiierul sursva avea denumirea ROBOTI.PAS, ROBOTI.C sau ROBOTI.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    46/64

    46

    Rezolvare

    Introducem n studiu urmtoarele notaii:

    r1 - numrul de roboi cu vrsta de 1 an;r2 - numrul de roboi cu vrsta de 2 ani;r3 - numrul de roboi cu vrsta de 3 ani.

    Evident, iniial r1= k

    0, r

    2=0 i r

    3=0, iar numrul curent de roboi se calculeaz ca

    s = r1 + r2 + r3.

    Vom notaxnumrul maxim de grupe de cte 3 indivizi ce pot fi formate din populaia

    cu s roboi, iar prin y- numrul grupelor formate din cte 5 roboi. Notnd prinp restulmpririi numrului de roboi s la 3 sau, prin alte notaii, p = smod 3, se observ cnumerelexi ypot fi determinate ca:

    a) pentru p = 0 avemx= (sdiv 3) i y= 0;b) pentru p = 1 avemx= (sdiv 3) - 3 i y= 2;c) pentru p = 2 avemx= (sdiv 3) - 1 i y= 1.

    Cunoscnd numrul curent de roboi i divizarea lor n grupe, putem simula proceselede natere i mbtrnire a roboilor:

    r3 := r2;r2 := r1;r1 := 5x+ 9y.

    Prin urmare, numrul de roboi kn

    n anul n poate fi calculat iterativ, cunoscndnumrul de roboi n anul precedent pe categoriile de vrst r

    1, r

    2i r

    3.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    47/64

    47

    ProgramRoboti;{ Clasele 7-9 }

    var f:text;i,N,k:integer;r:array[1..3] of longint;s:longint;x,y,p:longint;

    beginassign(f,roboti.in); reset(f);readln(f,k,N); close(f);r[1]:=k; r[2]:=0; r[3]:=0; s:=k;

    for i:=1 to n do beginx:=s div 3; p:=smod 3;

    if p=0 then y:=0; if p=2 thenbegin x:=x-1; y:=1; end; if p=1 thenbegin x:=x-3; y:=2; end;

    r[3]:=r[2]; r[2]:=r[1]; r[1]:=5*x+9*y;s:=r[1]+r[2]+r[3];

    end;

    assign(f,roboti.out); rewrite(f); writeln(f,s);close(f);end.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    48/64

    48

    Ziua 2

    Clasele 10 - 12

    Descrierea problemelor

    Denumireaproblemei

    Numrul depuncte alocat

    problemei

    Denumireafiierului surs

    Denumireafiierului de

    intrare

    Denumireafiierului de

    ieire

    Votul 100VOT.PASVOT.CVOT.CPP

    VOT.IN VOT.OUT

    Metroul 100METROU.PASMETROU.CMETROU.CPP

    METROU.IN METROU.OUT

    Cina 100CINA.PASCINA.CCINA.CPP

    CINA.IN CINA.OUT

    Total 300 - - -

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    49/64

    49

    Votul

    La nceputuri, pe o insul foarte ndeprtat, toate deciziile se adoptau la adunarea

    general a alegtorilor prin majoritate de voturi. Odat cu creterea numrului dealegtori, convocarea adunrilor generale a devenit practic imposibil. Pentru a nubloca procesul de adoptare a deciziilor s-a convenit ca insula s fie mprit ncircumscripii electorale, nu neaprat cu acelai numr de alegtori, iar orice proiect dedecizie s fie supus votului n fiecare circumscripie separat. Decizia se consideradoptat ntr-o circumscripie, dac pentru ea au votat mai mult de jumtate din alegtoriidin circumscripia respectiv. Decizia se consider adoptat pentru ntreaga insuldac ea a fost aprobat n mai mult din jumtate din numrul circumscripiilor.

    Evident, dac n cazul adunrilor generale deciziile se considerau adoptate numaiatunci cnd pentru ele votau majoritatea alegtorilor de pe ntreaga insul, n cazulcircumscripiilor acest lucru nu mai este necesar.

    De exemplu, presupunem c pe insul locuiesc 17 alegtori. n cazul adunrilorgenerale, pentru a aproba o decizie snt necesare 9 voturi pro. Daca ns formm 3circumscripii, i anume, prima cu 4, a doua cu 6 i a treia circumscripie cu 7 alegtori,pentru adoptarea unei decizii este suficient ca ea s fie votat n cel puin dou

    circumscripii, numrul necesar de voturi fiind 7.Scriei un program care, cunoscnd numrul de circumscripii i numrul de alegtori

    din fiecare circumscripie, calculeaz numrul de voturi, necesare pentru adoptareaunei decizii pentru ntreaga insul.

    Date de intrare.Fiierul text VOT.IN const din dou linii. Pe prima line este nscris numrulcircumscripiilorn. Linia a doua a fiierului de intrare conine n numere ntregi

    pozitive ce reprezint numrul alegtorilor din fiecare circumscripie.

    Date de ieire.Fiierul text VOT.OUT va conine pe o singur linie un numr natural - numrulnecesar de voturi.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    50/64

    50

    Exemplu.VOT.IN VOT.OUT3 74 6 7

    Restricii.n 1000. Numrul de alegtori pe insul nu depete valoarea 30000.Timpul de execuie nu va depi 1 secund. Fiierul surs va avea denumireaVOT.PAS, VOT.C sau VOT.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    51/64

    51

    Rezolvare

    Reprezentm numrul de alegtori din fiecare circumscripie n forma unui vector

    (tablou) A= (a1, a

    2, a

    3, ..., a

    n),

    elementele cruia snt sortate n ordine cresctoare:

    a1a

    2a

    3 ... a

    n.

    Se observ c numrul minim de voturi m, necesare pentru adoptarea unei deciziipoate fi determinat ca

    m= (a1div 2 +1) + (a

    2div 2 +1) +

    +(a3div 2 +1) + ...(a

    kdiv 2 + 1),

    unde k= (ndiv 2) +1.

    ProgramVotul;{ Clasele 7-9 }

    var A:array[1..1000] of integer;n:integer;vots:longint;

    procedure InitData;{ Citirea datelor de intrare }

    var f:text; i:integer;begin

    assign(f,vot.in); reset(f);

    readln(f,n); for i:=1 to n do read(f,A[i]);

    close(f);end; { InitData }

    procedure BubleSort;{Sortarea vectorului A prin metoda bulelor }

    var i,k,l,t:integer;begin

    l:=n-1;

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    52/64

    52

    while 1A[i+1] then begin

    t:=A[i]; A[i]:=A[i+1]; A[i+1]:=t;k:=i;

    end;l:=k-1;

    end;end; { BubleSort }

    procedure Calc;{ Calcularea numarului minim de alegatori }

    var i:integer;begin for i:=1 to (n div 2) +1 do

    vots:=vots+((A[i] div 1)+1);end; { Calc }

    procedure Outputdata;{ Extragerea datelor de iesire }var f:text;beginassign(f,vot.out);rewrite(f); writeln(f,vots);close(f);

    end; { Outputdata }

    beginInitData;BubleSort;Calc;OutputData;

    end.

    Din analiza procedurilorBubleSortiCalc se observ ca numrul de operaiinecesare pentru sortarea componentelor vectorului A este proporional cu n2. Evident,

    pentru n 1000, timpul de execuie nu va depi o secund.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    53/64

    53

    Metroul

    Metroul din Londra reprezint un sistem complex, care transport zilnic milioane de

    pasageri (fig. 1). Din punctul de vedere al pasagerului, metroul poate fi tratat ca omulime de linii de tren i o mulime de staii. n scopuri didactice, vom nota liniile de trenprin literele mariA, B, C, D .a.m.d. ale alfabetului latin, n total n linii, iar staiile - prinnumerele naturale 1, 2, 3, ..., n total m staii (fig. 2).

    Fig. 1 Fig. 2

    Liniile de tren i staiile respective au fost proiectate n aa fel, nct pasagerul, care

    pleac din orice staiex, s poat ajunge n oricare alt staie y. Evident, n cazurile ncare staiile se afl pe linii diferite, pasagerul este nevoit s fac una sau mai multetransbordri, schimbnd trenul n staiile n care se ntlnesc dou sau mai multe linii detren.

    De exemplu, pentru a ajunge din staia 1 n staia 8 (fig. 2), pasagerul poate s faco singur transbordare n staia 2 sau dou transbordri - prima n staia 4 i a doua nstaia 6.

    Elaborai un program, care, cunoscnd planul metroului, staia de plecarexi staia

    de sosire y, calculeaz numrul minim de transbordri.

    Date de intrare.Fiierul text METROU.IN conine pe prima linie numerele naturale n, m, x,yseparate prin spaiu. Fiecare din urmtoarele n linii ale fiierului conine numerede staii separate prin spaiu. Linia a 2-a a fiierului de intrare conine numerele destaii ale liniei de trenA, linia a treia a fiierului de intrare conine numerele de staiiale liniei de tren B .a.m.d.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    54/64

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    55/64

    55

    Rezolvare

    Introducem n studiu mulimile L1, L2, ..., Ln, fiecare mulime reprezentnd cte o liniede tren. De exemplu, n cazul fig. 2, avem:

    L1 = {1, 2, 3, 4, 5} - liniaA;L

    2= { 2, 6, 8} - linia B;

    L3 = {7, 6, 4} - linia C;L4 = { 5, 9} - linia D.

    De asemenea, vom utiliza urmtoarele notaii:

    S mulimea staiilor de metrou;S

    k mulimea staiilor de metrou la care se ajunge, pornind din staiax, prin

    exact ktransbordri.

    Mulimile S0, S1, S2, ..., Skpot fi calculate iterativ, dup cum urmeaz:

    1) n mulimea S0 se includ toate staiile de pe liniile pe care apare staiax;2) n mulimea S

    1se includ toate staiile de pe liniile pe care apare cel puin o staie

    din mulimea S0, dar care nu au fost deja incluse n S

    0;

    3) n general, n mulimea Sk

    se includ toate staiile de pe liniile pe care apare celpuin o staie din mulimea S

    k-1, dar care nu au fost deja incluse n mulimile

    S0, S1, S2, ..., Sk-1.

    ntruct numrul minim de transbordri nu poate depi valoarea n-1, calculelerecurente ale mulimilor S0, S1, S2, ..., Sk se vor termina cnd k= n 1.

    Pe calculator mulimile S0, S1, S2, ..., Sk pot fi reprezentate cu ajutorul unui singurvector

    mjtT= , denumit vectorul transbordrilor. Componentele t

    jale acestui vector

    pot fi calculate iterativ dup cum urmeaz:

    - iniial pentru toate componentele stabilim tj= - 1, fapt ce semnific

    S0 = S1 = S2 = ... = Sk=;- n continuare, pentru toate staiilejdin mulimea S

    k(kva lua consecutiv valorile

    0, 1, 2 .a.m.d.) stabilim tj= k.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    56/64

    56

    n programul ce urmeaz liniile de tren i vectorul transbordrilor snt reprezentateprin structurile de date

    const nmax=26;mmax=250;

    type Linie = setof 1..mmax;var L : array [1..26] of Linie;

    n : 2..nmax;m, x, y : 3..mmax;T : array[1..mmax] of integer;

    iar apartenena staiilor la anumite linii de metrou se verific cu ajutorul operatoruluiin.

    ProgramMetro;{ Clasele 10-12 }const nmax=26;

    mmax=250;type Linie = setof 1..mmax;var L : array [1..26] of Linie;

    n : 2..nmax;m, x, y : 3..mmax;T : array[1..mmax] of integer;

    procedure Citeste;{ Citirea datelor de intrare }

    var i, j : integer;Intrare : text;

    begin

    assign(Intrare, METRO.IN);reset(Intrare);readln(Intrare, n, m, x, y);

    for i:=1 to n do begin

    L[i]:=[]; whilenot eoln(Intrare) do begin

    read(Intrare, j);

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    57/64

    57

    L[i]:=L[i]+[j]; end; { while }

    readln(Intrare);

    end; { for }close(Intrare);

    end; { Citeste }

    procedure Scrie;{ Scrierea datelor in fisierul de iesire }

    var i, j, k : integer;Iesire : text;

    begin

    assign(Iesire, METRO.OUT);rewrite(Iesire);writeln(Iesire, T[y]);close(Iesire);

    end; { Scrie }

    procedure Transbordari;{ Calculeaza vectorul T }

    var i, j, k, q : integer;begin

    { initializam vectorul T } for j:=1 to m do T[j]:=-1;

    { calculam multimea S0 } for i:=1 to n do if (x in L[i]) then for j:=1 to m do if (j in L[i]) then T[j]:=0;

    { calculam multimile Sk } for k:=1 to n-1 do for i:=1 to n do for j:=1 to m do if ((j in L[i]) and (T[j]=k-1)) then for q:=1 to m do if ((q in L[i]) and (T[q]=-1)) then

    T[q]:=k;end; { Transbordari }

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    58/64

    58

    beginCiteste;Transbordari;

    Scrie;end.

    Din analiza procedurii Transbordari se observ c complexitatea temporala algoritmului respectiv este de ordinul O(n2m2). Conform restriciilor problemei,n 26 i m 250. Prin urmare, n cazul cel mai nefavorabil, numrul necesar deoperaii este de ordinul 108, mrime comparabil cu capacitatea de prelucrare acalculatoarelor personale.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    59/64

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    60/64

    60

    Date de intrare.Fiierul text CINA.IN conine pe prima linie numrul natural n. Fiecare dinurmtoarelen linii ale fiierului de intrare conine cte dou numere naturale separateprin spaiu. Pe linia i +1 snt nscrise numerele c

    i

    , di

    , separate prin spaiu.

    Date de ieire.Fiierul text CINA.OUT va conine pe o singur linie un numrul natural - sumaminim de bani necesar pentru procurarea pinii.

    Exemplu.CINA.IN CINA.OUT4 107

    1 64 17 08 6

    Restricii.1 n 1000, 1 c

    i 10000, 0 d

    i 100. Timpul de

    execuie nu va depi 1 secund. Fiierul surs va avea denumirea CINA.PAS,CINA.C sau CINA.CPP.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    61/64

    61

    Rezolvare

    Aceast problem admite o soluie n cadrul programrii dinamice. Vom extinde

    problema la calcularea sumei minime pentru a satisface cerinele cinei festive pentrucererea de la calitatea 1 la calitatea i. Pentru i= 1, evident, aceast sum este

    R1 = c1(d1+5).

    Pentru nceput, se observ c nlocuirea a unui numr incomplet de pini de oanumit calitate printr-o calitate mai bun nu duce la micorarea costului, ci dimpotriv,duce la mrirea costului, astfel este evident c vom nlocui toate pinile de o anumitcalitate printr-o calitate superioar sau nu vom nlocui acea calitate deloc.

    n continuare, s observm c dac se obine micorarea costului la nlocuireapinilor de calitatea h prin calitatea t, atunci i la nlocuirea pinilor de calitatea h princalitatea z, unde zeste cea mai mic calitate dup h, pentru care organizatorii ausolicitat un numr nenul de pini, tot va duce la o micorare cel puin la fel de bun acostului. Astfel putem considera ca schimbrile de calitate vor fi efectuate in iruriconsecutive, adic, vor fi iruri consecutive de caliti

    i1, i1+1, i1+2, i1+3, , i1+t,

    care vor fi toate nlocuite prin calitatea i1+t+1.

    Presupunem c avem deja calculate toate rezultatele pentru ide la 1 la k-1, atunciR

    kse va calcula dup cum urmeaz.Se va ncerca schimbarea tuturor calitilor, de lajla k-1, prin k. Dac rezultatul este

    mai bun, atunci el l va nlocui pe rezultatul curent. Prin urmare, obinem formularecurent pentru aflarea lui R

    k:

    )),((min 1,1 ijkjk ckjSDRR += = ,

    unde SD(j, k) este suma tuturordh, h =j, ..., k.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    62/64

    62

    ProgramCina;{ Clasele 10-12 }

    varC : array[0..1000] of integer;D : array[0..1000] of integer;R : array[0..1000] of longint;

    { suma minima pentru a satisface cerereaorganizatorilor in calitatile 1..i}

    S : array[0..1000] of longint;{numarul piinilor care vor cerute de calitatea1..i}

    n: integer;

    t: integer;{indicele celei mai mari calitatii solicitate deorganizatori}

    procedure CitesteDate;{citeste datele din fisierul de intrare}var f:text;

    i:integer;begin

    assign(f,Piini.in); reset(f);readln(f,n);

    for i:=1 to n do readln(f,C[i],D[i]);close(f);

    end; { CitesteDate }

    procedure Process;var i,j,p:integer;begin

    R[0]:=0; for i:=1 to n doif D[i]>0 then t:=i;{t va reprezenta calitatea cea mai mare pentrucare organizatorii au solicitat piine }

    s[0]:=0; for i:=1 to n do s[i]:=s[i-1]+D[i]; for i:=1 to n do begin

    R[i]:=R[i-1]+(D[i]+5)*C[i]; for j:=i-1 downto 1 do

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    63/64

    63

    begin if R[i]>R[j-1]+(s[i]-s[j-1]+5)*C[i]

    then

    R[i]:=R[j-1]+(s[i]-s[j-1]+5)*C[i];{ incearca sa micsorezi pretul }

    end; { for j } end; { for i }end; { Process }

    procedure ScrieDate;{Scrie datele in fisierul de iesire }

    var f:text; i:integer;

    beginassign(f,piini.out); rewrite(f);writeln(f,R[t]);close(f);

    end; { ScrieDate }

    beginCitesteDate;Process;

    ScrieDate;end.

    Complexitatea programului poate fi uor stabilit ca fiind O(n2) i se ncadreaz cuuurin n timpul de 1 secund.

  • 8/8/2019 Olimpiada Republican A La a 2003 - Probleme Si Solutii

    64/64