Sunteți pe pagina 1din 4

Nume: Popa Maria-Mihaela

Grupa:252
An: II
18. S se determine simultan, prin metoda Divide et
Impera maximul i minimul dintr-un tablou de n numere
ntregi.

Precizari cu privire la enunt: Consider ca acest enunt este


foarte clar si se intelege foarte usor cerinta!
Explicarea modului de lucru:

Presupunem ca sirul are mai mult de doua numere, deci nu este o problema
elementara ( care sa admita o rezolvare imediata ) si prin urmare suntem nevoiti sa
spargem problema in doua subprobleme, impartind sirul dat in doua subsiruri. Se
cauta valoarea maxima a fiecarui subsir dupa care se alege maximul dintre cele
doua valori. Idem, se cauta valoarea minima din fiecare subsir dupa care se alege
minimul dintre cele doua valori. Fie i,j, rangurile de inceput, respectiv de sfarsit ale
unui subsir. Daca diferenta intre i si j este mai mare ca 1 ( subsirul are mai mult de
doua elemente ) subproblema nu este inca elementara si se continua divizarea in
subprobleme, in care noile ranguri sunt ( i, (i+j)/2 ), respectiv ( ( i + j )/2 + 1 , j )
unde, evident , ( i + j )/2 este rangul termenului din mijlocul sirului.
Daca diferenta dintre i si j este mai mica decat 2, problema este elementara si
se rezolva imediat
Combinam apoi rezultatele partiale, retinand intotdeauna valoarea maxima si
pe cea minima dintre cele doua.
Problema va fi rezolvata in mod recursiv:

#include<iostream.h>
int x[100],n;
void citire(int p,int q)
{int m;
if(p==q) cin>>x[p];
else {m=(p+q)/2;
citire(p,m);

citire(m+1,q); }
}
void maxmin (int p,int q,int &min,int &max)
{int m,min1,min2,max1,max2;
if(p==q) {min=x[p];
max=x[p];
else {m=(p+q)/2;
minmax(p,m,min1,max1);
minmax(m+1,q,min2,max2);
if(min1<min2) min=min1;
else min=min2;
if(max1>max2) max=max1;
else max=max2; }
}
void main()
{int max,min;
cin>>n;
citire(1,n);
minmax(1,n,min,max)

cout<<min<< <<max; }

void minmax(int v[], int s, int d, int &minn, int &maxx)


{
if(s==d) minn=maxx=v[s];
else
{
int a,b,x,y;
minmax(v,s,(s+d)/2,a,x);
minmax(v,(s+d)/2+1,d,b,y);
if(a<b) minn=a;
else minn=b;
if(x>y) maxx=x;
else maxx=y;
}

Problema asemanatoare: Se citete un vector cu n componente numere


ntregi (numerele se presupun ordonate cresctor) i o valoare ntreag ("nr"). S se
decid dac nr se gsete sau nu printre numerele citite, iar n caz afirmativ s se
tipreasc indicele componentei care conine aceast valoare.
O rezolvare n care nr se compar pe rnd cu toate cele n componente reperzint o
pierdere de performan (nu exploateaz faptul c cele n valori sunt n secven
cresctoare). Algoritmul care va fi propus este optim i se poate spune c face parte
dintre algoritmii "clasici".

#include <iostream>
using namespace std;
int v[10],n;
int min(int i, int j)
{
int a, b, m;
if (i==j) return v[i];
else
{
m = (i+j)/2;
a = min(i, m);
b = min(m+1, j);
if (a<b) return a;
else return b;
}
}
int main( )
{
cout<<n=;cin>>n;
for (int i=1; i<=n; i++)
{
cout<<v[<<i<<]=; cin>>v[i];
}
cout<<min=<<min(1,n);
return 0;
}

Barem de corectare:
- Nota 5: -pentru descrierea principiului de rezolvare
- Nota 6: - pentru incercarea implementarii principiului
divide et impera
- Nota 7- 8: - daca programul afiseaza partial corect
rezultatul
- Nota 9: - daca programul este implementat corect dar
are mici erori la rulare

Nota 10: - daca programul afiseaza in mod correct


rezultatul si nu are nicio eroare

S-ar putea să vă placă și