Concursul INFO-STAR 98 "MoȘ Nicolae" la Clubul CopiilorSorin Groza Clubul Copiilor din Aiud a organizat ediția a IV-a a concursului județean de informatică INFO-STAR. Și în acest an "piticii" s-au întrecut în rezolvarea problemelor de informatică, probleme propuse de către domnul profesor Ovidiu Domșa de la Colegiul "Horea, Cloșca și Crișan" din Alba Iulia. Vă prezentăm în continuare problemele din concurs, împreună cu rezolvările propuse de către copiii care au obținut un punctaj maxim.
Cadouri de Moș NicolaeAna, Emil și Nicu găsesc în ghetele din geam cadouri de la Moș Nicolae. Fiecare dintre ei descoperă printre cadouri câte un loz în plic câștigător a unei sume de bani. Copiii doresc să cumpere de la un prieten o rachetă care costă s lei. Suma trebuie plătită exact, folosind unul două sau trei dintre lozurile copiilor. Ajutați-i să rezolve problema și afișați pe ecran numele copiilor din banii cărora se poate cumpăra racheta. Dacă nu există soluție se va afișa mesajul: Copiii nu cumpara racheta!'. Date de intrare: 500 - câștigul Anei 1000 - câștigul lui Nicu 5000 - câștigul lui Emil 6000 - prețul rachetei Date de ieșire: Nicu Emil Rezolvare Problema constă în a verifica toate posibilitățile de formare a prețului rachetei, folosind sumele celor trei copii. Se folosește o variabilă "semafor" c, care primește valoarea 1 atunci când se găsește o soluție a problemei și în acest caz se tipărește cel puțin o soluție. Dacă în final această variabilă are valoarea 0 (cea inițială) înseamnă că nu s-a găsit nici o soluție și în acest caz se va tipări mesajul cerut. Vom prezenta rezolvări implementate în limbajele Basic și Pascal. Listing: MOS.BAS INPUT "Castigul Anei este"; q INPUT "Castigul lui Nicu este"; w INPUT "Castigul lui Emil este"; e INPUT "Costul rachetei"; s c=0 IF q=s THEN PRINT "Ana": c=1 IF w=s THEN PRINT "Nicu": c=1 IF e=s THEN PRINT "Emil": c=1 IF q+w=s THEN PRINT "Ana Nicu": c=1 IF q+e=s THEN PRINT "Ana Emil": c=1 IF w+e=s THEN PRINT "Nicu Emil": c=1 IF q+w+e=s THEN PRINT "Ana Nicu Emil": c=1 IF c=0 THEN PRINT "Copiii nu cumpara racheta" Observație: În varianta implementată în Pascal în locul variabilei c (având două valori posibile) am folosit variabila booleană se_poate. Listing: MOS.PAS Program Mos_Nicolae; var q,w,e,s:Integer; se_poate:Boolean; Begin Writeln('Castigul Anei este '); Readln(q); Writeln('Castigul lui Nicu este '); Readln(w); Writeln('Castigul lui Emil este '); Readln(e); Writeln('Costul rachetei '); Readln(s); se_poate:=false; if q=s then begin Writeln('Ana'); se_poate:=true end; if w=s then begin Writeln('Nicu'); se_poate:=true end; if e=s then begin Writeln('Emil'); se_poate:=true end; if q+w=s then begin Writeln('Ana Nicu'); se_poate:=true end; if q+e=s then begin Writeln('Ana Emil'); se_poate:=true end; if w+e=s then begin Writeln('Nicu Emil'); se_poate:=true end; if q+w+e=s then begin Writeln('Ana Nicu Emil'); se_poate:=true end; if not se_poate then Writeln('Copiii nu cumpara racheta') End. Cura de slăbireLa un tratament de cură de slăbire de k zile se înscriu n persoane, fiecare dintre ele având o anumită greutate. Greutatea ideală se consideră a fi mai mare sau egală cu a și mai mică sau egală cu b . Persoanele urmează unul din următoarele tratamente: - cei sub greutatea ideală se îngrașă 1 kg pe zi; - cei peste greutatea ideală slăbesc 1 kg pe zi; - cei cu greutatea ideală își păstrează greutatea. Problema cere să se afle: a) numărul persoanelor cu greutate ideală la începutul tratamentului; b) numărul persoanelor cu greutate ideală după cele k zile de tratament. Date de intrare: Cate persoane participa la cura? 10 Cate zile dureaza cura? 7 Intervalul de greutate ideala: 40 50 Greutatile persoanelor: 38 41 48 50 52 54 58 60 42 32 Date de ieșire: a) 4 b) 7
Rezolvare: Pentru rezolvarea primului punct se parcurge șirul în care sunt păstrate greutățile și se numără câte elemente sunt cuprinse în intervalul [a,b]. În continuare se aplică tratamentul enunțat pentru cele k zile, zi cu zi. Se parcurge de k ori șirul greutăților și se fac modificările corespunzătoare pentru fiecare parcurgere, adică după fiecare zi. Se poate întâmpla ca după un anumit număr de zile o persoană să ajungă la greutatea ideală și astfel tratamentul ei se încheie. După cele k parcurgeri se numără din nou câte elemente aparțin intervalului [a,b], adică numărul persoanelor cu greutate ideală la sfârșitul tratamentului. Listing: CURA.BAS INPUT "Cate persoane participa la cura? "; n DIM g(n) FOR i=1 TO n PRINT "greutatea persoanei"; i INPUT g(i) NEXT i INPUT "Cate zile dureaza cura? "; k INPUT "Intervalul de greutate ideala: "; a, b nri=0: nrf=0 FOR i=1 TO n IF g(i)>=a AND g(i)<=b THEN nri=nri+1 NEXT i PRINT "a)"; nri FOR zile=1 TO k FOR i=1 TO n IF g(i)<a THEN g(i)=g(i)+1 IF g(i)>b THEN g(i)=g(i)-1 NEXT i NEXT zile FOR i=1 TO n IF g(i)>=a AND g(i)<=b THEN nrf=nrf+1 NEXT i PRINT "b)"; nrf Listing: CURA.PAS Program Tratament; var n,i,k,a,b,nri,nrf,zile:Integer; g:array[1..100] of Integer; Begin Writeln('Cate persoane participa la cura? '); Readln(n); Writeln('Greutatile persoanelor: '); for i:=1 to n do Read(g[i]); Readln; Writeln('Cate zile dureaza cura? '); Readln(k); Writeln('Intervalul de greutate ideala: '); Readln(a,b); for i:=1 to n do if (g[i]>=a) and (g[i]<=b) then Inc(nri); Writeln('a) ',nri); for zile:=1 to k do for i:=1 to n do begin if g[i]<a then Inc(g[i]); if g[i]>b then Dec(g[i]) end; for i:=1 to n do if (g[i]>=a) and (g[i]<=b) then Inc(nrf); Writeln('b) ',nrf) End. Jocul eliminăriiLa un joc participă n copii așezați în cerc. Se stabilește o persoană p de la care va începe jocul și un număr întreg m. De la persoana aleasă, numărând în sensul acelor de ceasornic, este eliminată a m -a persoană. Cercul se închide din nou și se continuă numărătoarea de la următoarea persoană de după cea eliminată. Repetând acest procedeu sunt eliminate toate persoanele, ultima ieșită din joc fiind declarată câștigătoare. a) afișați persoanele în ordinea în care sunt eliminate; b) stabiliți numele persoanei de la care ar trebui să înceapă numărătoarea, pentru a fi învingătoare persoana k . Date de intrare: n=5, p=2, m=7, k=3 Date de ieșire: a) 3 1 2 4 5 b) Incepe 5 Rezolvare Pentru afișarea persoanelor în ordinea eliminării, se va folosi un șir de lungime n cu elementele a[i]=i. Marcarea unei persoane eliminate i înseamnă că a[i] devine 0. Continuând numărarea, elementele egale cu 0 nu vor fi luate în considerare. Pentru a simula mișcarea circulară, indicele care identifică pozițiile persoanelor va deveni 1 în momentul în care se ajunge la sfârșitul șirului. Pentru a afla persoana de la care ar trebui să se înceapă jocul se va repeta rezolvarea punctului anterior, variind persoana de la care începe jocul până când persoana introdusă de la tastatură este învingătoare. Pentru un număr mare de persoane, timpul de răspuns crește. De aceea, pentru punctul b) propunem un algoritm mai simplu: la punctul a) se determină diferența dintre poziția persoanei de la care se începe jocul și poziția persoanei care câștigă jocul. Pentru a afla numele persoanei de la care trebuie să înceapă jocul se va scădea din poziția persoanei care trebuie să câștige, diferența găsită la punctul a). Listing: JOC.PAS Program Joc; var n,m,i,j,k,p,nr_iesiti:Byte; copil:array[1..100] of Byte; Begin Write('Introduceti numarul de persoane: '); Readln(n); Write('Introduceti persoana aleasa: '); Readln(p); Write('Introduceti numarul m: '); Readln(m); Write('Introduceti k: '); Readln(k); for i:=1 to n do copil[i]:=i; Writeln('Se elimina in ordine: '); nr_iesiti:=0; i:=p-1; while nr_iesiti<n do begin j:=0; while j<m do begin if i<n then i:=i+1 else i:=1; if copil[i]<>0 then j:=j+1 end; copil[i]:=0; Write(i); nr_iesiti:=nr_iesiti+1 end End.
În încheiere vă propunem spre rezolvare următoarea problemă: Centrul de InformaticăLa Aiud s-a inaugurat noul centru de informatică. Un grup format din n copii doresc să se înscrie la cursurile organizate la acest centru. Știind că grupurile de cursanți sunt constituite numai din prieteni, cunoscând perechile de prieteni și știind că este valabilă afirmația "Prietenul prietenului meu îmi este prieten și mie", aflați: a) numele copiilor care nu au nici un prieten; b) numele copiilor care au cei mai mulți prieteni direcți (care formează o pereche de prieteni); c) numele prietenilor unui copil x citit de la intrare. Date de intrare: n=6 1 2 2 3 5 6 x=3 Date de ieșire: a) 4 b) 2 cu 2 prieteni directi c) 1 2
Domnul profesor Sorin Groza este cadru didactic la Clubul Copiilor din Aiud și poate fi contactat prin intermediul redacției. [cuprins] |