Documente Academic
Documente Profesional
Documente Cultură
Introducere
Observatii:
Reprezentare
X: p=0 1 2 3 4 5 q=6
-1 2 8 -3 1 9 6
p q
mij
2
= [(0+6)/2]=3
(x1) cuprins intre pozitiile p si mij, iar mij devine “noul q”.
p=0 1 3 q=3
-1 2 8 -3
p=4 5 q=6
1 9 6
6
(x21): p=4 q=5
1 9
(x22): p=q=6
In sfarsit, urmatoarele descompuneri ale vectorilor conduc la
probleme elementare:
Si in continuare:
Maximul dintre x11 si x12 este 8, adica maximul lui x1 este
8.
Maximul dintre x21 si x22 este 9. adica maximul lui x2 este
9.
Rezolvare
if (max1>max2)
return max1;
else
return max2;
p=0 1 2 3 4 q=5
x: -6 -5 -1 5 8 9
p q
mij : mij 2
2
p=q=3 x[4]
(x21) 5 8
p=q=5
(x22) 9
Sa analizam problema elementara: x[mij]=a, adica x[4]=8,
moment in care algoritmul se incheie deoarece valoarea cautata
a fost gasita!
p q
p=q=3, mij
2
[(3 3) / 2] 3 ; primul subvector ar fi cuprins
intre pozitiile p=3 si q=mij-1=2, iar al doilea intre pozitiile
p=mij+1=4 si q=3. Acesti noi subvectori nu se mai pot
descompune in continuare, pentru ca nu sunt “valizi”. Am ajuns
la subvectori care nu contin nici un element, si se observa cu
usurinta contidia care defineste aceasta situatie: q<p!
Rezolvare
#include<iostream.h>
int x[20],n,a,i;
int div_imp (int p, int q)
{
int mij;
if (q<p)
return 0;
else
{
mij=(p+q)/2;
if(x[mij]= =a)
return 1;
else
if(a<x[mij])
return div_imp (p, mij-1);
else
return div_imp (mij+1,q);
}
}
void main()
{
cout <<”\n n=”; cin n;
cout <<”\n x[0]=”; cin >> x[0];
for(i=1;i<=n-1;i++)
do
{
cout << “x[“<<i<<”]=”; cin >> x[i];
} while (x[i]<=x[i-1]);
cout << “\n a=”; cin >>a;
if(div_imp (o,n-1))
cout <<”\n Valoarea cautata exista in vector”;
else
cout <<”\n Valoarea cautata nu exista in vector”;
}
Reprezentare
Rezolvare
Probleme suplimentare
1. Consideram un sir de n numere intregi, ordonat crescator si
un numar intreg x. Scrieti un algoritm care imparte sirul dat
in doua subsiruri in asa fel incat toate elementele primului
subsir sa fie mai mici sau cel mult egale cu x, iar toate
elementele celui de-al doilea subsir sa fie strict mai mari
decat x.
2. Se citeste de la tastatura un sir cu n elemente numere intregi.
Sa se gaseasca elementul aflat pe o pozitie data k in sirul
ordonat crescator, fara a efectua ordonarea.
3. Folosind Divide et Impera, sa se calculeze n!, unde valoarea
lui n (1<=n<=20) se citeste de la intrare.
4. Cunoscandu-se numarul n al elevilor unei clase, precum si
mediile generale ale celor n elevi la finele unui an scolar,
realizati un program care, folosind un algoritm Divide et
Impera, testeaza daca in clasa respective exista doi elevi cu
aceeasi medie generala. Programul va tipari pe ecran mesajul
“da” sau “nu”, in functie de situatie.