Documente Academic
Documente Profesional
Documente Cultură
Orice secvență a unui vector este unic determinată de doi indici st ≤ dr, ai
primului, respectiv ultimului element din secvență.
(10,20,30,40), (30,40,50,60,70), (10,20,30,40,50,60,70,80), (50), (80) repr
ezintă secvențe ale lui X
(10,30,40,20) nu reprezintă secvență în X – ordinea valorilor nu este cea
din X
(10,20,40,50) nu reprezintă secvență în X – valorile nu sunt consecutive
în X
(10,20,30,35,40) nu reprezintă secvență în X – avem o valoare care nu
apare în X
Obs. Deci prin secvenţă a unui şir dat se înţelege o succesiune de unul
sau mai mulţi termeni din şir aflaţi pe poziţii consecutive.
De exemplu, pentru şirul (2,5,6,8,12,14,23,31), o secvenţă a acestuia este subşirul
(8,12,14,23). Precizez că şirul dat este o secvenţă a lui însuşi.
Deci dacă şirul dat este o secvenţă, atunci orice subşir al acestuia care are
termenii situaţi pe poziţii consecutive se numeşte subsecvenţă.
1
Secvență crescătoare
Dată o secvență cu n numere naturale, să se spună dacă cele n numere din secvență sunt în ordine
crescătoare (fiecare număr este mai mic sau egal cu cel de după el). Numerele naturale sunt mai mici sau
egale cu 2000000000.
crescatoare.in crescatoare.out Explicație
5 DA Secvenţa citită este o secvenţă crescătoare .
2 5 7 9 10
9 NU Secvenţa citită nu este o secvenţă crescătoare.
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;
}
Scvenţă platou
Se dă o secvență de n numere naturale. Să se găsească subsecvenţa de lungime maximă ce are toate
numerele egale. Numerele naturale sunt mai mici sau egale cu 2000000000.
Exemple:
Rezolvare:
2
pas1. Se citeşte n, numărul de numere. Citim primul număr în variabila a şi iniţializăm lungimea
secvenţei curente (secvenţa ce începe cu numărul citit în variabila a) cu 1 şi lungimea secvenţei maxime
cu 1 (lc=1,lmax=1).
pas2. Cât timp mai există numere necitite (i<n), citim un nou număr în variabila b. Comparăm a cu b.
Avem două situaţii:
• a=b, caz în care creşte lungimea secvenţei curente (lc=lc+1) şi o comparăm cu lmax, iar dacă
lc>lmax, actualizăm lmax cu lc (lmax=lc).
• a!=b, în acest caz iniţializăm a cu b (a=b) si lc cu 1 (lc=1).
pas3. În ambele situaţii incrementăm variabila i cu 1 (i=i+1) şi reluăm pas1.
După ce au fost citite toate numerele, se afişează lungimea secvenţei maxime.
#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
{ a = b; lc = 1;}
}
fout<<lmax;
fin.close(); fout.close();
return 0;
}
Subsecvență crescătoare
Se dă o secvența de n numere. Să se găsească subsecvenţa de lungime maximă ce are toate numerele
ordonate crescător. Dacă există mai multe astfel de secvente, se vor afişa toate. Din fişierul de intrare
cresc.in se va citi de pe prima linie un număr natural n, reprezentând numărul de numere al sevenţei date,
iar de pe rândul următor se vor citi n numere naturale, separate printr-un spaţiu. În fişierul de ieşire
cresc.out, se va afişa pe o linie lungimea secvenţei maxime, iar pe celelale linii, secvenţele de lungime
maximă, câte una, pe linie.
cresc.in cresc.out Explicaţie
15 5 Există două secvenţe 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
3
Rezolvare:
O secvenţă crescătoare poate începe din oricare poziţie (i=1,…,n). Notăm cu lc, lungimea secvenţei
curente, iar cu lmax, lungimea celei mai mari secvenţe crescătoare. Comparăm elementele din poziţii
consecutive două câte două, şi de câte ori găsim o pereche de elemente consecutive (v[i],v[i+1]) egale,
creştem lungimea secvenţei curente cu 1(lc=lc+1). Când vom găsi două elemente situate pe poziţii
consecutive diferite, vom compara lungimea secvenţei curente, lc, cu lungimea secvenţei maxime, lmax.
În cazul în care lc>lmax, actualizăm lmax cu lc(lmax=lc). Iniţializăm lc cu 1(lc=1) şi căutăm o nouă
secvenţă începând cu elementul care a schimbat ordinea crescătoare a şirului.
Facem observaţia că şi din poziţia n poate începe o secvenţă, chiar dacă ştim că are lungimea 1; pentru a
nu restrânge generalitea algoritmului, imediat după citire vom adăuga şirului în mod artificial un element
care să aibă valoarea precedentului, mai puţin o unitate (v[n+1]=v[n]-1). Aceasta pentru a schimba
ordinea elementelor din secvenţă ce începe cu ultimul element. Pentru a afişa toate secventeţe, se
parcurge din nou şirul, şi în momentul în care s-a găsit o secvenţă de lungime maximă, aceasta se
afişează. Indicele de sfârşit al secvenţei este acel i pentru care v[i]!=v[i+1], iar indicele de început al
secvenţei de lungime maximă este i-lc+1.
#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 adăugat un element
//determin secvenţa de lungime maximă
lc=1; 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';
//afişez toate secvenţele 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;
4
}
Tema
http://liis.ro/~infosuport/6/fisa_vectori.pdf
http://varena.ro secvenţa bitonă, monotonă, subsecvenţa crescătoare, gondola
http://campion.edu.ro problemele: cub3, munte3, arc
http://www.pbinfo.ro/ problemele: SecvZero, SecvEgale, kSecventa, Subsecv