Sunteți pe pagina 1din 4

Lecia 11 Probleme cu secvente in C++.

Clasa a V-a

Definiia secvenei

Prin secven a unui ir dat se nelege o succesiune de unul sau mai muli termeni din ir aflai pe poziii
consecutive. De exemplu, pentru irul dat (2,5,6,8,12,14,23,31), o secven a acestuia este subirul (8,12,14,23). Facem
precizarea c irul dat este o secven a lui nsui. Deci dac irul dat este o secven, atunci orice subir al acestuia care
are termenii situai pe poziii consecutive se numete subsecven.

Probleme rezolvate

Secven cresctoare
Dat o secven cu n numere naturale, s se spun dac cele n numere din secven sunt n ordine cresctoare (fiecare
numr este mai mic sau egal cu cel de dup el). Numerele naturale sunt mai mici sau egale cu 2000000000.
crescatoare.in crescatoare.out Explicaie
5 DA Secvena citit este o secven cresctoare.
2 5 7 9 10
9 NU Secvena citit nu este o secven cresctoare.
3 7 9 23 5 8 31 123 55

Rezolvare:

#include <fstream>
using namespace std;
ifstream fin("crescatoare.in");
ofstream fout("crescatoare.out");
int n,i,a,b,cresc;
int main()
{
fin>>n;
fin>>a;
cresc = 1;
i = 1;
while ( i < n && cresc == 1)
{
fin>>b;
if ( b < a ) cresc = 0;
else
{
a = b;
i++;
}
}
if ( cresc == 1 )
fout<<"DA";
else
fout<<"NU";
fin.close();
fout.close();
return 0;
}

1
Lecia 11 Probleme cu secvente in C++.
Clasa a V-a

Scven platou
Se d o secven de n numere naturale. S se gseasc subsecvena de lungime maxim ce are toate numerele egale.
Numerele naturale sunt mai mici sau egale cu 2000000000.
Exemple:
platou.in platou.out Explicaie
14 5 Secvena cu cele mai multe numere egale este 4 4 4 4 4 i are 5 numere.
34444477566999
Rezolvare:
pas1. Se citete n, numrul de numere. Citim primul numr n variabila a i iniializm lungimea secvenei curente
(secvena ce ncepe cu numrul citit n variabila a) cu 1 i lungimea secvenei maxime cu 1 (lc=1,lmax=1).
pas2. Ct timp mai exist numere necitite (i<n), citim un nou numr n variabila b. Comparm a cu b. Avem dou
situaii:
a=b, caz n care crete lungimea secvenei curente (lc=lc+1) i o comparm cu lmax, iar dac lc>lmax,
actualizm lmax cu lc (lmax=lc).
a!=b, n acest caz iniializm a cu b (a=b) si lc cu 1 (lc=1).

pas3. n ambele situaii incrementm variabila i cu 1 (i=i+1) i relum pas1.


Dup ce au fost citite toate numerele, se afieaz lungimea secvenei maxime. Mai jos gsii programul.

#include <fstream>
using namespace std;
ifstream fin("platou.in");
ofstream fout("platou.out");
int n,i,a,b,lc,lmax;
int main()
{
fin>>n;
fin>>a;
lmax = 1;
lc = 1;
for ( i = 1; i < n; i++ )
{
fin>>b;
if ( b == a )
{
lc++;
if ( lc > lmax )
lmax = lc;
}
else
2
Lecia 11 Probleme cu secvente in C++.
Clasa a V-a

{
a = b;
lc = 1;
}
}
fout<<lmax;
fin.close();
fout.close();
return 0;
}

Subsecven cresctoare
Se d o secvena de n numere. S se gseasc subsecvena de lungime maxim ce are toate numerele ordonate cresctor.
Dac exist mai multe astfel de secvente, se vor afia toate. Din fiierul de intrare cresc.in se va citi de pe prima linie
un numr natural n, reprezentnd numrul de numere al sevenei date, iar de pe rndul urmtor se vor citi n numere
naturale, separate printr-un spaiu. n fiierul de ieire cresc.out, se va afia pe o linie lungimea secvenei maxime, iar
pe celelale linii, secvenele de lungime maxim, cte una, pe linie.
cresc.in cresc.out Explicaie
15 5 Exist dou secvene cu lungime maxim 4 6 7 9 12 si 1 2 3 5 9
8 4 6 7 9 12 7 23 5 6 1 2 3 5 9 4 6 7 9 12
12359
Rezolvare:
O secven cresctoare poate ncepe din oricare poziie (i=1,,n). Notm cu lc, lungimea secvenei curente, iar cu
lmax, lungimea celei mai mari secvene cresctoare. Comparm elementele din poziii consecutive dou cte dou, i de
cte ori gsim o pereche de elemente consecutive (v[i],v[i+1]) egale, cretem lungimea secvenei curente cu 1(lc=lc+1).
Cnd vom gsi dou elemente situate pe poziii consecutive diferite, vom compara lungimea secvenei curente, lc, cu
lungimea secvenei maxime, lmax. n cazul n care lc>lmax, actualizm lmax cu lc(lmax=lc). Iniializm lc cu 1(lc=1)
i cutm o nou secven ncepnd cu elementul care a schimbat ordinea cresctoare a irului.
Facem observaia c i din poziia n poate ncepe o secven, chiar dac tim c are lungimea 1; pentru a nu restrnge
generalitea algoritmului, imediat dup citire vom aduga irului n mod artificial un element care s aib valoarea
precedentului, mai puin o unitate (v[n+1]=v[n]-1). Aceasta pentru a schimba ordinea elementelor din secven ce
ncepe cu ultimul element.
Pentru a afia toate secventee, se parcurge din nou irul, i n momentul n care s-a gsit o secven de lungime
maxim, aceasta se afieaz. Indicele de sfrit al secvenei este acel i pentru care v[i]!=v[i+1], iar indicele de nceput al
secvenei de lungime maxim este i-lc+. Mai jos gsii programul.
#include <fstream>
using namespace std;
ifstream fin("cresc.in");
ofstream fout("cresc.out");
int n,i,j,v[101],lc,lmax;
int main()
{
fin>>n;
for(i=1; i<=n; i++)
fin>>v[i];
v[n+1]=v[n]-1;//am adugat un element
//determin secvena de lungime maxim
lc=1;
3
Lecia 11 Probleme cu secvente in C++.
Clasa a V-a

lmax=1;
for(i=1; i<=n; i++)
{
if(v[i]<=v[i+1])
{
lc++;
}
else
{
if(lc>lmax) lmax=lc;
lc=1;
}
}
fout<<lmax<<'\n';
//afiez toate secvenele de lungime maxim
lc=1;
for(i=1; i<=n; i++)
{
if(v[i]<=v[i+1])
{
lc++;
}
else
{
if(lc==lmax)
{
for(j=i-lc+1;j<=i;j++)
fout<<v[j]<<' ';
fout<<endl;
}
lc=1;
}
}

return 0;
}

Tema

http://liis.ro/~infosuport/6/fisa_vectori.pdf
http://varena.ro secvena biton, monoton, subsecvena cresctoare, gondola
http://campion.edu.ro problemele: cub3, munte3, arc
http://www.pbinfo.ro/ problemele: SecvZero, SecvEgale, kSecventa, Subsecv

Trimitei soluiile pe adresa maftei03@gmail.com sub forma unei arhive denumit cu numele vostru.
Creai arhiva urmnd paii:
1. Creai un folder cu numelevostru_tema5
2. Copiai una cte una sursele main.cpp n acest folder i redenumii-le cu numele problemei
3. Arhivai acest folder pstrnd numele arhivei identic cu cel al folderului
4. Ataai arhiva la email-ul pe care l trimitei la adresa maftei03@gmail.com

Termen: 20 martie 2016, ora 21

SUCCES!

S-ar putea să vă placă și