Paul se joacă un nou joc pe calculator. În el, trebuie să traverseze o zonă montană cât mai rapid posibil. Uitându-se pe harta jocului, el poate observa toate înălțimile terenului din jurul său. Astfel, el poate alege secvența de pași pe care să o facă pornind din punctul în care se află și până la destinație.
Fiind o zonă montană, e posibil ca drumul ales de Paul să urce, iar apoi să coboare pe munte. El se gândește că ar fi bine să evite un astfel de drum, deoarece ar însemna mai mult efort din partea lui. La fel, după ce a coborât o pantă, Paul ar prefera să nu trebuiască să urce din nou.
Cerință
Paul a desenat pe hartă un drum pe care ar putea să o ia pentru a ajunge la destinație. A notat înălțimea fiecărei bucăți de teren pe o hârtiuță, în ordinea în care trebuie să le parcurgă.
Ți se dă șirul de înălțimi ca un șir de numere întregi, nenule, separate prin spațiu. Șirul de numere se încheie cu valoarea 0, care nu face parte din înălțimi (doar marchează finalul șirului). Să se precizeze dacă șirul de înălțimi este crescător, descrescător sau nemonoton. Spunem că un șir e nemonoton dacă nu este nici crescător, nici descrescător în întregime.
Date de intrare
Se dă un șir de numere naturale urmat de valoarea 0.
Date de ieșire
Se va afișa unul dintre mesajele crescator, descrescator sau nemonoton.
Restricții și precizări
Înălțimile sunt numere cuprinse între 0 și 10 000
Se vor citi maxim 1 000 de numere
0 nu face parte din șirul de înălțimi, doar marchează finalul șirului
Pentru simplitate, dacă toate numerele sunt egale sau nu există nicio valoare înaintea lui 0, șirul se consideră nemonoton
Exemple
Date de intrare Date de ieșire
1 2 5 5 10 11 0 crescator
16 7 3 0 descrescator
1 2 2 1 0 nemonoton
Răspunsuri la întrebare
Salut!
Ai rezolvarea in C++ mai jos
#include <iostream>
using namespace std;
int main()
{
bool cresc = false, desc = false, nemo = false, primaCitire = true;
int curr, ant;
cin >> curr;
if (curr != 0)
{
ant = curr;
while (curr != 0)
{
cin >> curr;
//DACA DUPA PRIMUL NUMAR AVEM 0
if (curr == 0)
{
if (primaCitire)
{
nemo = true;
}
break;
}
//PRIMA CITIRE
if (curr < ant)
{
desc = true;
nemo = false;
}
if (curr > ant)
{
cresc = true;
nemo = false;
}
if (curr == ant && !cresc && !desc)
{
nemo = true;
}
//DACA NU E PRIMA CITIRE
if (curr < ant && cresc)
{
nemo = true;
cresc = false;
desc = false;
break;
}
if (curr > ant && desc)
{
nemo = true;
cresc = false;
desc = false;
break;
}
ant = curr;
primaCitire = false;
}
}
else
{
nemo = true;
}
if (nemo)
{
cout << "nemonoton";
}
if (cresc)
{
cout << "crescator";
}
if (desc)
{
cout << "descrescator";
}
return 0;
}
Explicatie:
Folosim 3 variabile booleane cresc, desc si nemo pentru a retine daca sirul este crescator, descrescator respectiv nemonoton (initializate cu false, ulterior le vom modifica pe parcursul programului). Citim primul element (pe care ulterior il verificam sa nu fie 0), iar apoi citim si al 2 lea element (la fel, verificat sa nu fie 0), in caz contrar afisam corespunzator. Mai departe citim urmatoarele elemente cate unul si verificam daca conditia initiala de cresc/desc se adevereste, daca nu intram in nemonoton si putem sa ii dam un break fortat, deoarece nu mai are rost sa verificam sirul mai departe.
In final, afisam rezultatul corespunzator.
- Ti-am lasat mai jos si fisierul sursa
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline bool comp_desc_unsigned(unsigned a, unsigned b) {
return b<a;
}
int main() {
vector<unsigned> munti;
unsigned curent;
while (true) {
cin >> curent;
if (curent) munti.push_back(curent);
else break;
}
char monotonie = 0; //0-nemonotom, 1-crescator, 2-descrescator
if (munti.size() < 2) monotonie = 0;
else if (is_sorted(munti.begin(), munti.end())) monotonie = 1;
else if (is_sorted(munti.begin(), munti.end(), comp_desc_unsigned)) monotonie = 2;
if (monotonie == 0) cout << "nemonoton";
else if (monotonie == 1) cout << "crescator";
else if (monotonie == 2) cout << "descrescator";
}
► Explicatie
Folosim container vector din STL si functia is_sorted din algorithm pentru a verifica daca vectorul e sortat.
Functia is_sorted primeste trei parametrii :
- Primul e pointer/iterator catre primul element din sir
- Al doilea este pointer/iterator catre finalul sirului
- Al treilea (optional) e un comparator care specifica cum se compara elementele. Un comaprator e 0 functie care primeste doua elemente a,b si returneaza 1 daca a si b sunt in ordinea corecta sau 0 altfel. Daca nu furnizam un comparator se va compara folosind relatia de ordine data de operatorul <.
Raspunsul primit de la Sergetec e foarte bun, dar iti propun si aceasta varianta orientata pe caracteristici mai interesante ale limbajului. Iti recomand citirea documentatiei pentru a afla mai multe despre ce avem la dispozitie in C++ si cum fac aceste chestii viata mai usoara.