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:
-
- #include<iostream>
- using namespace std;
- #include<conio.h>
-
-
- int main()
- {
- int N,s[50],i,j,nr=0,suma=0;
-
- cout<<"Introduceti numarul N de stive, 0 < N <= 50 : ";
- cin>>N;
- while(N<=0 || N>50)
- {
- cout<<"\nIncorect! Reintroduceti numarul: ";
- cin>>N;
- }
-
- cout<<"\nIntroduceti numarul X de caramizi pentru fiecare stiva, 0 < X <= 100: ";
- for(i=0;i<N;i++)
- {
- cout<<"\nS"<<i<<": ";
- cin>>s[i];
- while(s[i]<=0 || s[i]>100)
- {
- cout<<"\nIncorect! Reintroduceti numarul: ";
- cout<<"\nS"<<i<<": ";
- cin>>s[i];
- }
- suma+=s[i];
- }
- if(suma%N!=0) cout<<"Nu se pot face mutari astfel incat toate stivele sa aiba toate acelasi numar de caramizi!";
- else
- {
- for(i=0;i<N;i++)
- {
- if(s[i]<suma/N) nr+=suma/N-s[i];
- }
- if(nr==0) cout<<"Nu trebuie mutata nici o caramida!";
- else
- if(nr==1) cout<<"o caramida trebuie mutata astfel: "<<endl;
- else
- cout<<endl<<nr<<" caramizi trebuie mutate astfel: "<<endl;
-
- for(i=0;i<N;i++)
- {
- while(s[i]<suma/N)
- for(j=0;j<N;j++)
- {
- if(s[i]<suma/N && s[j] >suma/N) {cout<<endl<<"S"<<j<<" -> S"<<i<<endl;s[i]++;}
- }
- }
- }
- _getch();
- return 0;
- }
-
Mihai:
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
-
- struct pereche{short int stiva,nr;};
- int comparare(const void *a, const void *b)
- {return (((pereche *)a)->nr)-(((pereche *)b)->nr);}
-
- int main()
- {
- int N,S=0;
- pereche *v;
- printf("Introduceti numarul de stive: ");
- scanf("%d",&N);
- v=new pereche[N];
- if(N<=0||N>50)
- {
- printf("Numarul de stive ar trebui sa fie din intervalul (0,50]");
- getch();
- return 0;
- }
-
- for(int i=0;i<N;i++)
- {
- printf("Introduceti numarul de pietre din stiva %d: ",i+1);
- scanf("%hd",&v[i].nr);
- if(v[i].nr<=0||v[i].nr>100)
- {
- printf("Numerele de pietre ar trebui sa fie din intervalul (0,100]");
- getch();
- return 0;
- }
- S+=v[i].nr;
- v[i].stiva=i+1;
- }
-
- if(S%N)printf("\nStivele nu pot contine acelasi numar de pietre!");
- else
- {
- qsort(v,N,sizeof(pereche),comparare);
- short int medie=S/N;
- if(v[0].nr==medie)printf("Stivele au deja acelasi numar de pietre!");
- else
- {
- printf("\nMutarile efectuate:\n");
- for(int i=0,j=N-1;v[i].nr!=medie;i++)
- while(v[i].nr!=medie)
- {
- if(v[j].nr!=medie)v[j].nr--,v[i].nr++,printf("Stiva #%hd -> Stiva #%hd\n",v[j].stiva,v[i].stiva);
- else j--;
- }
- }
- }
- getch();
- return 0;
- }
-
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.