Informatică, întrebare adresată de sikesjack1, 8 ani în urmă

Buna!
Ma puteti ajuta cu problema #2533 SecventaIncadrata de pe pbinfo?

Cerința
Numim secvență încadrată a unui șir de numere naturale un subșir al acestuia, format din termeni aflați pe poziții consecutive în șirul dat, subșir care începe și se termină cu aceeași valoare. Lungimea secvenței este egală cu numărul de termeni ai acesteia.

Să se determine secvențele încadrate dintr-un șir, care au lungimea maximă.

Date de intrare
Fișierul de intrare secventaincadrata.in conține cel puțin două și cel mult 106 numere naturale din intervalul [0,9], separate printr-un spațiu.

Date de ieșire
Fișierul de ieșire secventaincadrata.out va conține pe prima linie numărul L, reprezentând lungimea maximă a secvențelor încadrate, iar pe a doua linie a fișierului valoarea primului termen al fiecărei secvențe încadrate de lungime maximă, în ordine crescătoare și separate printr-un spațiu.

Restricții și precizări
în șir există ce puțin doi termeni egali
proiectați un algoritm eficient din punctul de vedere al timpului de executare și a memoriei utilizate
se recomandă o soluție care să evite stocarea tuturor valorilor citite într-un tablou sau într-o altă structură de date similară

Exemplu
secventaincadrata.in

3 1 5 2 4 5 5 2 5 9 5 7 4 6 8 0 8
secventaincadrata.out

9
4 5
Explicație
Cele două secvențe încadrate de lungime maximă egală cu 9, sunt 5 2 4 5 5 2 5 9 5, respectiv 4 5 5 2 5 9 5 7 4.

Multumesc!

Răspunsuri la întrebare

Răspuns de boiustef
6

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("secventaincadrata.in");

ofstream g("secventaincadrata.out");

int cif, poz[10], lung[10], c, lungmax;

int main()

{

   while (f>>cif)

   {

       ++c;

       if (poz[cif]==0) { poz[cif]=c; lung[cif]=1; }

       else lung[cif]=c-poz[cif]+1;

   }

   for (cif=0; cif<10; ++cif)

       if (lung[cif]>lungmax) lungmax=lung[cif];

   g << lungmax << "\n";

   for (cif=0; cif<10; ++cif)

       if (lung[cif]==lungmax) g << cif << " ";

}

Explicație:


sikesjack1: Multumesc muult!!
boiustef: :))), rămâne să ânţelegi logica...
în vectorul poz semnalez prima apariţie a cifrei, iar în vectorul lung calculez lungimea secvenţei dacă cifra din poz se repetă
sikesjack1: am o nelamurire, de ce mereu vectorul de frecventa are lungimea de 10?? La orice problema e asa si nu inteleg de ce???
boiustef: Se citesc cifre în problema aceasta, dar cifrele au valori de la 0 la 9, deaceea şi vectorul se ia de această dimensiune
boiustef: Date de intrare
Fișierul de intrare secventaincadrata.in conține cel puțin două și cel mult 106 numere naturale din intervalul [0,9], separate printr-un spațiu.
boiustef: nu în orice problemă vectorul de frecvenţă e de aşa lungime... depinde de problemă
sikesjack1: am inteles acuma, practic trebuie cate un loc pt fiecare cifra posibila, daca ar zice de exemplu, ca trebuie cautat cel mai mare numar cu doua cifre, as face un vector fr[100], nu?
boiustef: da... după enunţ... dacă de patru cifre...
boiustef: la o adică poz nu e fector de frecvenţă, e caracteristic, semnalează prima apariţie a cifrei, adică dacă poz[5]=7, înseamnă că cifra 5 de prima dată a fost găsită în şir pe poziţia a 7-a
sikesjack1: am inteles, multumesc!
Alte întrebări interesante