[2] Concurs - Stive de caramizi

[2] Concurs - Stive de caramizi

Postby v0id » 08 Feb 2010, 11:46

Se da un numar N (0 < N <= 50) de stive ce contin caramizi.
Stivele de caramizi pot contine orice numar X de caramizi, 0 < X <= 100.

Sa se calculeze si sa se afiseze numarul de caramizi care trebuie mutate astfel incat toate stivele sa contina un numar egal de caramizi. De asemenea, sa se afiseze si fiecare mutare :)

Ex.:
Pentru N = 4, se dau urmatoarele stive de caramizi: 4, 5, 6, 9.

Se va afisa:
Nr. caramizi care trebuie mutate: 3
Mutarile: S2 -> S3 (unde S2 = Stiva sursa, S3 = Stiva destinatie - este doar un exemplu. Pentru FIECARE mutare sa se afiseze ceva similar)

Normal, se vor puncta si verificarile datelor de intrare.

Durata:
8-13 Februarie - inscrierea in concurs
14 Februarie - declararea castigatorului

Good luck!
0,0p / 0 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 39.5

Re: [2] Concurs - Stive de caramizi

Postby Mihai » 08 Feb 2010, 22:21

Hai sa sparg eu gheata de data asta :) : in atasament.

L.E.: Am modificat ca sa nu mai fie nevoie de consola. Si i-am mai adaugat o mica verificare ;)).
L.E. 2: Am updatat ceva la program - dadea eroare cand numarul pietrelor/stivelor era 0 (pusesem < in loc de <=, undeva in cod).
3p / 1 votes
Attachments
mihai_stive.zip
(16.48 KiB) Downloaded 37 times
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: [2] Concurs - Stive de caramizi

Postby DarkByte » 09 Feb 2010, 09:21

As prefera un "wait for key" la final, in loc sa fiu nevoit sa intru in cmd pentru a vedea output-ul :)
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 136

Re: [2] Concurs - Stive de caramizi

Postby Archangel » 14 Feb 2010, 00:48

Hop si eu pe ultima suta de metri ;)) (in atasament)
1p / 1 votes
Attachments
archangel_stive.zip
(10.5 KiB) Downloaded 34 times
User avatar
Archangel
Bit
 
Joined: 31 Dec 2009
Status: 1

Re: [2] Concurs - Stive de caramizi

Postby v0id » 15 Feb 2010, 15:37

Mi-a revenit onoarea de a desemna castigatorul pentru ca Mihai a participat la concurs.
So... Castigatorul este Mihai.

Motivul principal pentru care a castigat Mihai este ca programul lui Archangel mie nu mi-a mers pe 4 masini: 1 x Windows 7, 2 x Windows XP si 2 x Windows Vista. Imi dadea o eroare de genul "The program cannot be run because its side-by-side configuration is incorrect". Mi-a mers doar pe un Windows Server 2008, pe care aveam instalat Visual Studio 2008 Express. Probabil e vorba despre vreo dependinta...

Oricum, solutia lui Mihai este mai eleganta si mai eficienta, desi as avea niste comentarii de facut si la el:
- cerintele nu sunt respectate in totalitate pentru ca se afiseaza doar mutarile, nu si numarul acestora...
- mesajul "Stivele nu pot contine acelasi numar de pietre!" apare atunci cand nu exista solutii. As fi preferat ceva mai explicit, pentru ca initial am stat sa ma gandesc ce vrea sa spuna :) Din acest punct de vedere, Archangel sta mai bine.

Codul celor doi participanti este mai jos. Mihai, te asteptam cu noua tema de concurs :)

Archangel:
  1.  
  2. #include<iostream>
  3. using namespace std;
  4. #include<conio.h>
  5.  
  6.  
  7. int main()
  8. {
  9.     int N,s[50],i,j,nr=0,suma=0;
  10.  
  11.     cout<<"Introduceti numarul N de stive, 0 < N <= 50 :  ";
  12.     cin>>N;
  13.     while(N<=0 || N>50)
  14.     {
  15.         cout<<"\nIncorect! Reintroduceti numarul: ";
  16.         cin>>N;
  17.     }
  18.  
  19.     cout<<"\nIntroduceti numarul X de caramizi pentru fiecare stiva, 0 < X <= 100: ";
  20.     for(i=0;i<N;i++)
  21.     {
  22.         cout<<"\nS"<<i<<": ";
  23.         cin>>s[i];
  24.         while(s[i]<=0 || s[i]>100)
  25.         {
  26.             cout<<"\nIncorect! Reintroduceti numarul: ";
  27.             cout<<"\nS"<<i<<": ";
  28.             cin>>s[i];
  29.         }
  30.         suma+=s[i];
  31.     }
  32.     if(suma%N!=0) cout<<"Nu se pot face mutari astfel incat toate stivele sa aiba toate acelasi numar de caramizi!";
  33.     else
  34.     {
  35.         for(i=0;i<N;i++)
  36.         {
  37.             if(s[i]<suma/N) nr+=suma/N-s[i];
  38.         }
  39.         if(nr==0) cout<<"Nu trebuie mutata nici o caramida!";
  40.         else
  41.             if(nr==1) cout<<"o caramida trebuie mutata astfel: "<<endl;
  42.             else
  43.                 cout<<endl<<nr<<" caramizi trebuie mutate astfel: "<<endl;
  44.  
  45.         for(i=0;i<N;i++)
  46.         {
  47.             while(s[i]<suma/N)
  48.                 for(j=0;j<N;j++)
  49.                 {
  50.                     if(s[i]<suma/N && s[j] >suma/N) {cout<<endl<<"S"<<j<<" -> S"<<i<<endl;s[i]++;}
  51.                 }
  52.         }
  53.     }
  54.     _getch();
  55.     return 0;
  56. }
  57.  


Mihai:
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5.  
  6. struct pereche{short int stiva,nr;};
  7. int comparare(const void *a, const void *b)
  8. {return (((pereche *)a)->nr)-(((pereche *)b)->nr);}
  9.  
  10. int main()
  11. {
  12. int N,S=0;
  13. pereche *v;
  14. printf("Introduceti numarul de stive: ");
  15. scanf("%d",&N);
  16. v=new pereche[N];
  17. if(N<=0||N>50)
  18.     {
  19.     printf("Numarul de stive ar trebui sa fie din intervalul (0,50]");
  20.     getch();
  21.     return 0;
  22.     }
  23.  
  24. for(int i=0;i<N;i++)
  25.     {
  26.     printf("Introduceti numarul de pietre din stiva %d: ",i+1);
  27.     scanf("%hd",&v[i].nr);
  28.     if(v[i].nr<=0||v[i].nr>100)
  29.         {
  30.         printf("Numerele de pietre ar trebui sa fie din intervalul (0,100]");
  31.         getch();
  32.         return 0;
  33.         }
  34.     S+=v[i].nr;
  35.     v[i].stiva=i+1;
  36.     }
  37.  
  38. if(S%N)printf("\nStivele nu pot contine acelasi numar de pietre!");
  39. else
  40.     {
  41.     qsort(v,N,sizeof(pereche),comparare);
  42.     short int medie=S/N;
  43.     if(v[0].nr==medie)printf("Stivele au deja acelasi numar de pietre!");
  44.     else
  45.         {
  46.         printf("\nMutarile efectuate:\n");
  47.         for(int i=0,j=N-1;v[i].nr!=medie;i++)
  48.             while(v[i].nr!=medie)
  49.                 {
  50.                 if(v[j].nr!=medie)v[j].nr--,v[i].nr++,printf("Stiva #%hd -> Stiva #%hd\n",v[j].stiva,v[i].stiva);
  51.                 else j--;
  52.                 }
  53.         }
  54.     }
  55. getch();
  56. return 0;
  57. }
  58.  
0,0p / 0 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 39.5


Return to Concursuri de programare desktop

Who is online

Users browsing this forum: No registered users and 0 guests