Cod sursa(job #1456415)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 30 iunie 2015 17:07:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
#define dim 100001
#define infinit 2<<28

void citeste(ifstream &f, int *&v, int *&subsir, int *&pozitii, int &n)
{
    f >> n;
    //cout << "n = " << n << endl;
    v = new int[n + 1];
    subsir = new int[n + 1];
    pozitii = new int[n + 1];
    for(int i = 1; i <= n; ++i)
        f >> v[i];
}


int inserare_binara(int ce_adaug, int *unde_adaug, int &lung, int st, int dr)
{
    int mij = (st + dr) / 2;
    if(st == dr)
    {
        if(dr > lung)
        {
            ++lung;
            unde_adaug[dr] = ce_adaug;
            unde_adaug[lung+1] = infinit;
            //return st;
        }
        else
        {
            unde_adaug[st] = ce_adaug;
        }

        return st;
    }
    else
        if(ce_adaug <= unde_adaug[mij])
            return inserare_binara(ce_adaug, unde_adaug, lung, st, mij);
        else
            return inserare_binara(ce_adaug, unde_adaug, lung, mij + 1, dr);
}


void dinamica(int *v, int n, int *subsir, int *pozitii, int &lung)
{
    lung = 0;
    subsir[1] = infinit;
    for(int i = 1; i <= n; ++i)
        pozitii[i] = inserare_binara(v[i], subsir, lung, 1, lung + 1);
}

void construieste_solutia(int *&solutie,int *v, int *pozitii, int lung, int n)
{
    int i = lung, j = n;
    solutie = new int[lung + 1];
    while(i > 0)
    {
        while(pozitii[j] != i)
            --j;
        solutie[i] = v[j];
        --i;
    }
}


void scrie_solutie(ofstream &fis, int *vct, int lung)
{
    for(int i = 1; i <= lung; ++i)
        fis << setw(4) << vct[i];
    fis<<"\n";
}

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    int *v, *subsir, *pozitii, *solutie, n, lung;

    citeste(f, v, subsir, pozitii, n);
    //g << "am citit vct : " << endl;
    //scrie_solutie(g, v, n);
    dinamica(v, n, subsir, pozitii, lung);
    construieste_solutia(solutie, v, pozitii, lung, n);
    //scrie_solutie(g, solutie, lung);

    //scrie_solutie(g, pozitii, n);
    //scrie_solutie(g, subsir, lung);

    g<<lung<<"\n";
    for(int i=1; i<=lung; ++i) g<<solutie[i]<<" ";

    f.close();
    g.close();
    return 0;
}