online: 3; azi: 1087; total: 53093 Manual clasa a xi a - Tehnici de programare - Metoda greedy

Manual clasa a Xi a

Tehnici de programare

Metoda greedy

Intr un depozit al monetăriei statului sosesc n saci cu monede. Şeful depozitului cunoaşte numărul de monede din fiecare sac şi vrea să modifice conținutul sacilor, prin mutarea de monede dintr-un sac în altul, astfel încât, la sfârşit , să fie în fiecare sac acelaşi număr de monede. Să se scrie un program care să determine, dacă este posibil, numărul minim de mutări prin care fiecare sac să conțină acelaşi număr de monede, altfel să se afişeze un mesaj. Fiecare mutare se afişează sub forma: sac iniţial , sac final, număr de monede. (n<=2000, iar numărul total de monede <=1 .000.000.000)
# include < iostream >
using namespace std ;
const int max_n = 2000 ;
bool este_posibil ( int saci[], int n, int &medie) {
int total_monede = 0 ;
for ( int i = 0 ; i < n; i++) {
total_monede += saci[i];
}
if ( total_monede % n != 0 ) {
return false ;
}
medie = total_monede / n;
return true ;
}
int main () {
int n;
cin >> n;
int saci[ max_n ];
for ( int i = 0 ; i < n; i++) {
cin >> saci[i];
}
int medie;
if (! este_posibil (saci, n, medie)) {
cout << "Nu este posibil." << endl ;
return 0 ;
}
int mutari = 0 ;
for ( int i = 0 ; i < n - 1 ; i++) {
int diferenta = saci[i] - medie;
saci[i + 1 ] += diferenta ;
if ( diferenta != 0 ) {
cout << "Mutare: Sac " << (i + 1 ) << " -> Sac " << (i + 2 ) << ", " << abs ( diferenta ) << " monede" << endl ;
mutari ++;
}
}
cout << " Numarul minim de mutari : " << mutari << endl ;
return 0 ;
}

Pentru a rula programul, trebuie să introduceți datele de intrare în următoarea ordine:
Un exemplu de date de intrare ar putea fi:
5
7 3 9 11 10