Se numește vârf într-un șir de numere naturale un termen al șirului care este strict mai mare decât
fiecare dintre cei doi termeni vecini cu el, aflați în șir pe poziția din stânga, respectiv din dreapta sa.
Fișierul bac.in conține un șir de cel mult 106
numere naturale din intervalul [0,109], separate prin
câte un spațiu. Se cere să se afișeze pe ecran vârful din șirul aflat în fișier pentru care valoarea
absolută a diferenței dintre cei doi vecini ai săi este minimă. Dacă există mai multe astfel de numere, se
afișează cel mai mare dintre ele, iar dacă nu există niciun vârf, se afișează pe ecran mesajul
nu exista. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al spațiului
de memorie utilizat.
Exemplu: dacă fișierul conține șirul 2 7 10 5 6 2 1 3 20 17 9 11 7 3 10 6 2
se afișează pe ecran 11
Răspunsuri la întrebare
Răspuns:
citirea o fac de la tastatura, poti adauga tu din fisier la nevoie,
#include <iostream>
using namespace std;
int main() {
int n, v[106], i, d, min, vf;
cout <<"n=";
cin >> n;
for(i = 0; i < n; i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
d = 0;
//cel mai mare nr citit este 109, cel mai mic 0, deci diferenta cea mai mare poate fi 109-0=109
// initializam un minim cu un nr mai mare ca 109
min = 110;
vf = -1;
// de la al doilea nr si pana la penultimul, primul si ultimul excludem
// deoarece nu au vecini in stanga respectiv dreapta
for(i = 1; i < n-1; i++)
{
if(v[i] > v[i-1] && v[i] < v[i+1]) // verificam vecinii
{
d = v[i+1] -v[i-1]; //calculam diferenta dintre ei
if(d < min) // daca diferenta este minima, o actualizam
{
min = d;
if(v[i] > vf) // daca varful este maxim, il actualizam
{
vf = v[i];
}
}
}
}
if(vf == -1) // daca valoarea varfului nu s-a modificat, inseamna ca nu am gasit un nr sa indeplineasca conditiile de varf
cout<<"nu exista";
else
cout<<"varful maxim este: "<< vf;
return 0;
}