Cod sursa(job #2898433)

Utilizator iulia.talpalariuIulia-Georgiana Talpalariu iulia.talpalariu Data 6 mai 2022 18:46:36
Problema Planeta Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include <fstream>

std::fstream fileIn("planeta.in");
std::ofstream fileOut("planeta.out");
int nrArboriCautare[31];


void calculNrArbori(int nr) {
    nrArboriCautare[0] = 1;
    nrArboriCautare[1] = 1;
    for(int i = 2; i <= nr; ++i) // pt fiecare i calculez nr de arbori binari de cautare care se pot scrie cu nr 1...i
        for( int j = 0; j < i; ++j) { // al doilea for pt nr elem subarborele din stg
            nrArboriCautare[i] +=  nrArboriCautare[j] * nrArboriCautare[i-j-1]; // i-j-1 = nr de elem pt subarborele din dr

    }
}

/// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
///
void gasesteArboreRSD(int ii, int sf, int k) {
    // deci avem inordinea (adica numerele in ordine de la 1 la n) si pe rand verific daca nr k e mai mare decat ce generez si scad pana ma apropii
    int radCurenta;
    for ( radCurenta = ii; radCurenta < sf ; ++radCurenta){
        int nrSubarboreSt = radCurenta-ii;
        int nrSubarboreDr = sf-radCurenta;
        int nrArb = nrArboriCautare[nrSubarboreSt] * nrArboriCautare[nrSubarboreDr];
        if(nrArb <= k){
            k = k - nrArb;
        }
        else {
            break;// cand se opreste stiu ca nu mai e indeplinita conditia si a sarit nrArb de k
        }

    }

    std::cout << radCurenta << ' ';
    fileOut << radCurenta << ' ';
    if(radCurenta > ii) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore st -> tb sa ii gasim subarborele st
        gasesteArboreRSD(ii, radCurenta - 1, k / nrArboriCautare[sf-radCurenta]);
    }
    if(radCurenta < sf) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore drept -> tb sa ii gasim subarborele dr
        gasesteArboreRSD(radCurenta + 1, sf , k % nrArboriCautare[sf-radCurenta]);
    }




}

int main() {
    int n, w;
    fileIn >> n;
    calculNrArbori(n);
    fileIn >> w;
    gasesteArboreRSD(1,n,w - 1);
    for(int i = 0; i<= n; i++){
        std::cout << nrArboriCautare[i] <<' ';
    }

    return 0;
}