Probleme cu secvente



Problema 1

Fisierul "bac.in" contine n-valori naturale de maxim 9 cifre. Determinati cea mai lunga secventa de elemente ordonate strict crescator din vector. Daca exista mai multe astfel de secvente se va determina cea mai din stanga. Pe ecran se vor afisa indicele de inceput si cel de final al secventei;


#include <iostream>
#include <fstream>

using namespace std;

ifstream in("bac.in");

int main()
{
   int st, dr, l_max=0, l=1, x, y, cnt=1;

   // mergem pe ideea sa comparam cate 2 numere consecutive si sa vedem
   // daca precedentul(x) este mai mare decat numarul actual(y)

   in>>x;
   while(in>>y)
   {
      cnt++; // la al catelea numar suntem
      if(y>x) // daca respecta regula mergem mai departe si crestem lungimea curenta
         l++;
      else // am gasit un element care este mai mic decat precedentul
      {
         if(l>l_max) // in caza ca lungimea curenta este maxima, fiind '>' se va lua cea din stanga
         {
            l_max=l;
            st=cnt-l;
            dr=cnt-1;
         }
         l=1; // actualizam lungimea curenta cu un 1
      }
      // pentru a realiza compararile urmatoare este nevoie sa actualul sa devina precedent
      x=y;
   }
   in.close();

   // exista posibilitatea ca secventa maxima sa se afle la final
   // si sa nu se gaseasca un numar care sa nu respecte regula si 
   // astfel nu se actualizeaza l_max, asa ca verificam inca o data la final
   
   if(l>l_max)
   {
      st=cnt-l;
      dr=cnt-1;
   }
   cout<<st<<' '<<dr;
}



Problema 2

Numim secventa uniforma a unui sir de numere naturale un subsir al acestuia, format din termeni cu aceeasi valoare, aflati pe pozitii consecutive in sirul dat. Lungimea secventei este egala cu numarul de termeni ai acesteia.
In fisierul "bac.in" se afla un sir de cel putin doua și cel mult 1000000 de numere naturale din intervalul [0,109]. In sir exista cel putin doi termeni egali pe pozitii consecutive. Se cere sa se determine o secventa uniforma de lungime maxima in sirul dat si sa se afișeze pe ecran lungimea acestei secvente si termenii acesteia. Daca sunt mai multe astfel de secvente, se afiseaza doar termenii ultimei dintre acestea.


#include <iostream>
#include <fstream>

using namespace std;

ifstream in("bac.in");

int main()
{
    int l_cur=1, lmax=1, x, y;
    int nr; //deoarece secventa este formata din aceeasi termeni putem memora doar un termen

   // x-ul va fi precedentul iar in y vom citi cate un numar si vom verifica daca acestea sunt egale

    in>>x;
    while(in>>y)
    {
        if(y==x) // avem elemente consecutive egale
            l_cur++;
        else
        {
            if(l_cur>=lmax) // avem lungime curenta maxima, fiind '>=' se va lua secventa din dreapta
            {
                lmax=l_cur;
                nr=x; // numarul care formeaza aceasta secventa
            }
            l_cur=1; // actualizam l_cur cu 1 deoarece acum avem doar un element
            x=y; // fiindca trecem la alta secventa este necesar sa ne actualizam precedentul
        }
    }
    in.close();
    // facem verificarea de la final in cazul in care secventa noastra esta la 
    // final si nu va gasi un nr diferit de precedent, si astfel nu ne actualizeaza l_max
    if(l_cur>=lmax) 
    {
        lmax=l_cur;
        nr=x;
    }
    cout<<lmax<<endl;
    for(int i=1;i<=lmax;i++)
        cout<<nr<<' ';
}



Problema 3

Numim secventa neuniforma a unui sir de numere naturale un subsir al acestuia, format din termeni aflati pe pozitii consecutive in sirul dat, cu proprietatea ca oricare trei termeni aflati pe pozitii consecutive sunt diferiti. Lungimea secventei este egala cu numarul de termeni ai acesteia.
In fisierul "bac.in" se da un sir de cel mult 1 000 000 numere naturale din intervalul [0,9], in care exista cel putin trei termeni diferiti pe pozitii consecutive. Se cere sa se afiseze lungimea maxima a unei secvente neuniforme a sirului dat.


#include <iostream>
#include <fstream>

using namespace std;

ifstream in("bac.in");

int main()
{
    // deoarece trebuie sa verificam ca 3 numere consecutive sa fie
    // diferite este necesar sa avem cate 2 precedente(a si b) si un actual(c)

    int a, b, c, lmax=3, l=2;

    // initalizam lungimea curenta l cu 2 deoarece in momentul in care gasim
    // 3 numere diferite intre ele, l va deveni 3 si astfel il putem incrementa cu 1

    in>>a>>b;
    while(in>>c)
    {
        if(a!=b && a!=c && b!=c) // cele 3 sunt diferite intre ele
            l++;
        else // cel putin 2 sunt egale intre ele
        {
            if(l>lmax) // vedem daca avem lungime maxima
               lmax=l; 
            l=2; // actualizam lungimea curenta
        }
        // actualizam cei doi precedenti
        a=b;
        b=c;
    }
    in.close();

    // facem verificarea de la final in cazul in care secventa cautata este ultima

    if(l>lmax) 
      lmax=l;
    cout<<lmax;
}



Problema 4

Scrieti un program care citeste din fisierul "bac.in" un sir de cel mult 1 000 000 numere naturale din intervalul [0,1 000 000 000] ordonate crescator si determina cel mai mic numar din sir care apare de un numar impar de ori. Daca in sir nu se afla o astfel de valoare, se afiseaza mesajul nu exista.


#include <iostream>
#include <fstream>

using namespace std;

ifstream in("bac.in");

int main()
{
   int l=0, x, y;

   // deoarece cautam un minim impar si stim ca numere pot fi
   // maxim 1 000 000 000, ne vom initializa minimul cu valoarea respectiva

   int minim=1000000000;
   while(in>>x)
   {
      l=1;
      bool este_acelasi=1;
      while(in>>y && este_acelasi) // cat timp putem citi numere si nu am gasit unul diferit
      {
         if(x==y)
            l++;
         else
            este_acelasi=0;
            cout<<l<<' '; 
      }
      if(l%2==1 && x<minim)
         minim=x;
      x=y; // vom face acelasi lucru si pentru urmatorul
   }
   in.close();
   if(minim!=1000000000) // am gasit un numar
      cout<<minim;
   else
      cout<<"nu exista";
}