www.agora.ro

Concursul INFO-STAR ‘98

"MoȘ Nicolae" la Clubul Copiilor

  Sorin 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ș Nicolae

Ana, 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ăbire

La 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ării

La 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]