Răspuns :
a) Putem pune in niste vectori pozitiile primului si respectiv ultimului element egal cu o valoare la citire, si apoi folosim acesti vectori sa calculam lungimea maxima, care este mult mai eficient decat sa parcurgem iar vectorul initial(n + 10 parcurgeri (O(n)) vs 11n parcurgeri (1 pentru citire si 10 pentru fiecare numar, e tot O(n), dar mult mai ineficient)).
Daca stiu pozitia primului si ultimului element cu o anumita valoare, atunci lungimea secventei incadrate este [tex]poz_{finala} - poz_{initiala} + 1[/tex].
Astfel pot vedea care este lungimea maxima si apoi parcurg iar acesti vectori cu pozitii sa gasesc secventele respective, afisandu-le valoarea primului termen.
b)
#include <iostream>
#include <fstream>
using namespace std;
int poz_inceput[10], poz_final[10];
int main(){
int n;
ifstream f("bac.in");
int i = 1;
while(f >> n){
if(poz_inceput[n] == 0)
poz_inceput[n] = i;
poz_final[n] = i;
i++;
}
f.close();
//Calculam lungimea maxima
int lungimeMaxima = -1;
for(i = 0; i < 10; i++){
int lungime = poz_final[i] - poz_inceput[i] + 1;
if(lungime > lungimeMaxima)
lungimeMaxima = lungime;
}
cout << lungimeMaxima << '\n';
//Cautam valorile respective
for(i = 0; i < 10; i++){
int lungime = poz_final[i] - poz_inceput[i] + 1;
if(lungime == lungimeMaxima)
cout << i << ' ';
}
return 0;
}
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru orice întrebare sau dacă aveți nevoie de asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!