Dacă numărul de valori nu este constant, pentru a determina maximul sau minimul lor trebuie să folosim o structură repetitivă. Alegerea ei se face după cum este cunoscut sau nu numărul de valori care se prelucrează (cunoscut, nu constant !!):
- dacă se cunoaște numărul de valori de la început, putem folosi instrucțiunea
for: vezi problemele #n_maxim , #n_minim , #SumMaxMin , etc - dacă numărul de valori nu se cunoaște de la început, putem folosi instrucțiunea
while: vezi #Maxim
Determinarea minimului
Să rezolvăm următoarea problemă: Se dau n numere întregi. Calculaţi cel mai mic dintre cele n numere date.
Numărul de valori se cunoaște de la început. Algoritmul de rezolvare va fi:
- inițializăm variabila
mincorespunzător - citim cele
nnumere- fiecare număr se compară cu
minși dacă este cazul se actualizeazămin
- fiecare număr se compară cu
Cu ce valoare putem inițializa min? Distingem două posibilități:
- inițializăm
mincu prima dintre celenvalori; celelalalten-1valori se vor compara cumin - inițializăm
mincu o valoare foarte mare; fiecare dintre celenvalori citite se va compara cumin. Alegerea valorii inițiale a luimindepinde de restricțiile problemei; pentru problema #n_minim poate fi1.000.000.000.
În secvențele care urmează, n este numărul de valori citite, în x se citesc pe rând valorile iar în min vom determina valoarea minimă:
Inițializare cu prima valoare
cin >> n >> x;
min = x;
for(int i =1 ; i < n ; i ++)
{
cin >> x;
if(x < min)
min = x;
}
Inițializare cu o valoare mare
cin >> n;
min = 1<<30; //2^30 > 1000000000
for(int i =1 ; i <= n ; i ++)
{
cin >> x;
if(x < min)
min = x;
}
Determinarea maximului
Să rezolvăm următoarea problemă: Se citesc numere întregi până la apariția lui 0, care nu se ia în considerare. Calculaţi maximul lor.
Numărul de valori nu se cunoaște de la început. Algoritmul de rezolvare va fi:
- inițializăm variabila
maxcorespunzător - citim un număr în
x - cât timp
xeste nenulxse compară cumaxși dacă este cazul se actualizeazămax- citim altă valoare pentru
x
Și aici este semnificativă inițializarea variabilei max. Secvențele de mai jos surprind ambele situații:
Inițializare cu prima valoare
cin >> x;
max = x;
cin >> x;
while(x != 0)
{
if(x > max)
max = x;
cin >> x;
}
Inițializare cu o valoare mică
max = - (1<<30); //2^30 > 1000000000
cin >> x;
while(x != 0)
{
if(x > max)
max = x;
cin >> x;
}
Alte probleme
Minimul și numărul de apariții
Problemă: Se dau n numere întregi. Să se determine valoarea minimă și de câte ori apare printre cele n numere.
Rezolvare:
- fie
minvaloarea minimă șinr_minnumărul de apariții ale valorii minime - citim
nși primul dintre celennumere,x - inițializăm
mincuxșinr_mincu1– minimul a apărut o singură dată până acum - citim pe rând cele
n-1valori rămase în variabilax- dacă
x < min, actuatalizămmincuxșinr_mincu1 - dacă nu, verificăm dacă
x == min. În caz afirmativ, îl incrementăm penr_min.
- dacă
Cele mai mici două valori
Problemă: Se citesc numere întregi, mai mici decât 1.000.000.000 până la apariția lui 0, care nu se ia în considerare. Să se determine cele mai mici două numere dintre ele.
Rezolvare:
- fie
min1cel mai mic număr șimin2următorul cel mai mic număr - inițializăm
min1șimin2cu două valori mari, astfel:min1 = 1000000001,min2 = 1000000002 - citim un număr
x - cât timp
x != 0- prelucrăm pe
x; se disting cazurile:x < min1: se actualizează ambele minime, astfel:min2devinemin1, iarmin1devinexx >= min1, darx < min2: se actualizează numaimin2,min2 = x
- citim următoarea valoare pentru
x
- prelucrăm pe
Probleme ataşate
| Nr. | Problema | Clasa | Dificultate | Operații I/O |
|---|---|---|---|---|
| 1 | #0354 - n_maxim | 9 | ușoară | consola |
| 2 | #0355 - n_minim | 9 | ușoară | consola |
| 3 | #0347 - SumMaxMin | 9 | ușoară | consola |
| 4 | #0054 - Maxim | 9 | ușoară | consola |
| 5 | #0346 - MaxAndAp | 9 | ușoară | consola |
| 6 | #0119 - 2maxim | 9 | medie | consola |
| 7 | #0274 - 3minime | 9 | medie | consola |
| 8 | #0172 - difMin | 9 | medie | consola |
| 9 | #0357 - Perechi1 | 9 | medie | consola |
| 10 | #0358 - Plopi | 9 | medie | consola |