Informatică, întrebare adresată de EdwardK, 9 ani în urmă

Am o mare problemă cu această problemă de informatică:

Fie un șir n de numere întregi. Se cere să se determine secvența cea mai lungă care conține doar numere pozitive. Dacă în șir există mai multe secvențe de aceeași lungime, atunci se va afișa cea care are suma elementelor minimă.

Inițializez variabilele cu 0, citesc elementele vectorului, apoi mă blochez. Cum să fac?
Vă mulțumesc frumos pentru idei sau algoritmi!


artur99: prima dată setezi un maxl la 0, care să reprezinte lungimea celei mai mari secvențe, apoi pregătești un curentl cu 0 care să fie lungimea curentă
artur99: Apoi faci așa, stai că scriu în răspuns
artur99: aaah, stai că nu am citit și cu suma, mai e nevoie de o variabilă :))
EdwardK: Ok, aștept algoritmul atunci :)) Doar partea asta, nu tot, că e mai puțin de scris
artur99: aa, de fapt nu am văzut nici de chestia cu afișarea secvenței, da - trebuie un vector. Dar ce limite ai la n?
EdwardK: Nu am limită
artur99: aa, ok
artur99: Ai ceva exemple, să putem testa? :))
EdwardK: Pentru n=9 avem șirul (7, 8, 5, -1, 6, -2, 3, 1, 1) și se afișează secvența 3 1 1
artur99: Mersi, sper că înțelegi

Răspunsuri la întrebare

Răspuns de artur99
2
#include <iostream>
using namespace std;
int main(){
    int n, i, t;
    int max_lung=0, max_pos=-1, max_sum=0;
    int lst_lung=0, lst_pos=-1, lst_sum=0;
    cin>>n;
    int nr[n];
    for(i=0;i<n;i++){
        cin>>t;
        nr[i] = t;
        if(t>0){
            //număr pozitiv
            if(lst_pos == -1) lst_pos = i;
            //dacă este primul din secvență, setăm
            //poziția de început a secvenței
            lst_lung++;
            lst_sum+=t;
        }else{
            //nu este număr pozitiv, verificăm, resetăm
            if(lst_lung>max_lung || lst_lung==max_lung && lst_sum<max_sum){
                //dacă ultima secvență citită este
                //mai lungă decât cea maximă, sau dacă
                //este egală, dar suma mai mică
                max_lung = lst_lung;
                max_sum = lst_sum;
                max_pos = lst_pos;
                //setăm secvența curentă ca maxim
            }
            lst_lung = 0;
            lst_sum = 0;
            lst_pos = -1;
            //resetăm datele, pentru că am început
            //o secvență de nr ne-pozitive :))
        }
    }
    //Refacem ultima verificare, în caz că șirul
    //s-a terminat cu secvența căutată
    if(lst_lung>max_lung || lst_lung==max_lung && lst_sum<max_sum){
        max_lung = lst_lung;
        max_sum = lst_sum;
        max_pos = lst_pos;
    }
    for(i=max_pos;i<max_pos+max_lung;i++){
        cout<<nr[i]<<" ";
    }
    return 0;
}

EdwardK: Uau, și cu comentarii de explicație. Mulțumesc mult de tot :D
artur99: cp :D
Alte întrebări interesante