Cerința
De-a lungul bulevardului sunt n
copaci, numerotați de la 1
la n
, pentru fiecare cunoscându-se înălțimea, exprimată în centimetri. Primarul dorește să taie copacii și apelează la un vrăjitor care va proceda astfel: alege o secvență cât mai lungă de copaci învecinați și aplică o vrajă prin care toți înălțimea tuturor copacilor din secvență scade cu o aceeași valoare, strict pozitivă.
Să se determine care este numărul minim de vrăji care trebuie aplicate astfel încât toți copacii să aibă înălțime zero.
Date de intrare
Programul citește de la tastatură numărul n
, iar apoi n
numere naturale, reprezentând înălțimile copacilor.
Date de ieșire
Programul va afișa pe ecran numărul C
, reprezentând numărul minim de vrăji necesare.
Restricții și precizări
1 ≤ n ≤ 1000
- înălțimile arborilor sunt numere naturale nenule mai mici decât
1.000.000
- secvența aleasă de vrăjitor la un moment dat nu poate conține copaci de înălțime zero
Exemplu
Intrare
5 5 2 3 5 3
Ieșire
4
Explicație
- prima vrajă se aplică pe întreg șirul de copaci (secvența
1 - 5
) și micșorează toți copacii cu2
.
Șirul devine:3 0 1 3 1
. - a doua vrajă se aplică pe secvența
1 - 1
) și micșorează copacii din secvență cu3
.
Șirul devine:0 0 1 3 1
. - a treia vrajă se aplică pe secvența
3 - 5
) și micșorează copacii din secvență cu1
.
Șirul devine:0 0 0 2 0
. - a patra vrajă se aplică pe secvența
4 - 4
) și micșorează copacii din secvență cu2
.
Șirul devine:0 0 0 0 0
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Vraja2:
#include <iostream>
using namespace std;
int n , v[1005], cnt;
void vraja(int st , int dr)
{
if(st <= dr)
{
int Min = v[st];
for(int i = st + 1 ; i <= dr ; i ++)
if(v[i] < Min)
Min = v[i];
if(Min > 0)
cnt ++;
for(int i = st ; i <= dr ; i ++)
if(v[i] > Min)
{
int j = i + 1;
while(j <= dr && v[j] > Min)
j ++;
vraja(i , j - 1);
i = j;
}
}
}
int main(){
int n;
cin >> n ;
for(int i = 1 ; i <= n ; ++i)
cin >> v[i];
vraja(1 , n);
cout << cnt;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #839 Vraja2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #839 Vraja2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!