Cod sursa(job #1755200)

Utilizator enacheionutEnache Ionut enacheionut Data 9 septembrie 2016 16:17:56
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>

using namespace std;

vector<int> CitireInput(int &dimensiuneSirNumere)
{
    ifstream in("scmax.in");
    in>> dimensiuneSirNumere;
    vector<int> sirNumere(dimensiuneSirNumere);

    for( auto &item : sirNumere )
    {
        in>> item;
    }

    return sirNumere;
}

int CautareBinara( vector<int> sirNumere, vector<int> subsirCrescatorMaximal,
                    int dimensiuneSubsirCrescatorMaximal, int numar )
{
    int start = 0;
    int mijloc;
    int dimensiuneAux = dimensiuneSubsirCrescatorMaximal;

    while( start <= dimensiuneSubsirCrescatorMaximal )
    {
        mijloc = (start + dimensiuneSubsirCrescatorMaximal) / 2;

        if( mijloc < dimensiuneAux && sirNumere[subsirCrescatorMaximal[mijloc]] < numar &&
            numar <= sirNumere[subsirCrescatorMaximal[mijloc + 1]] )
        {
            return mijloc + 1;
        }
        else if( sirNumere[subsirCrescatorMaximal[mijloc]] < numar )
        {
            start = mijloc + 1;
        }
        else
        {
            dimensiuneSubsirCrescatorMaximal = mijloc - 1;
        }
    }
    return -1;
}

int ConstruireSubsirCrescatorMaximal(vector<int> sirNumere, vector<int> &subsirCrescatorMaximal,
                          vector<int> &pozitiiSubsirCrescatorMaximal, int dimensiuneSirNumere)
{
    int dimensiuneSubsirCrescatorMaximal = 0;
    subsirCrescatorMaximal[0] = 0;

    for( int i = 1; i<dimensiuneSirNumere; ++i )
    {
        if( sirNumere[subsirCrescatorMaximal[0]] > sirNumere[i] )
        {
            subsirCrescatorMaximal[0] = i;
        }
        else if( sirNumere[subsirCrescatorMaximal[dimensiuneSubsirCrescatorMaximal]] < sirNumere[i])
        {
            ++dimensiuneSubsirCrescatorMaximal;
            subsirCrescatorMaximal[dimensiuneSubsirCrescatorMaximal] = i;

            pozitiiSubsirCrescatorMaximal[subsirCrescatorMaximal[dimensiuneSubsirCrescatorMaximal]] =
                subsirCrescatorMaximal[dimensiuneSubsirCrescatorMaximal - 1];
        }
        else
        {
            int index = CautareBinara( sirNumere, subsirCrescatorMaximal, dimensiuneSubsirCrescatorMaximal, sirNumere[i] );
            subsirCrescatorMaximal[index] = i;
            pozitiiSubsirCrescatorMaximal[subsirCrescatorMaximal[index]] = subsirCrescatorMaximal[index - 1];
        }
    }

    return dimensiuneSubsirCrescatorMaximal;
}

void ScrieOutput(vector<int> sirNumere, vector<int> subsirCrescatorMaximal,
                 vector<int> pozitiiSubsirCrescatorMaximal, int dimensiuneSubsirCrescatorMaximal)
{

    ofstream out("scmax.out");
    out<< dimensiuneSubsirCrescatorMaximal + 1<< endl;

    list<int> subsirMaximal;

    int index = subsirCrescatorMaximal[dimensiuneSubsirCrescatorMaximal];

    while( index != -1 )
    {
        subsirMaximal.push_front(sirNumere[index]);
        index = pozitiiSubsirCrescatorMaximal[index];
    }

    for( auto &it : subsirMaximal )
    {
        out<< it<<" ";
    }

    out.close();
}

int main()
{
    int dimensiuneSirNumere;

    vector<int> sirNumere = CitireInput(dimensiuneSirNumere);
    vector<int> subsirCrescatorMaximal(dimensiuneSirNumere);
    vector<int> pozitiiSubsirCrescatorMaximal(dimensiuneSirNumere, -1);

    int dimensiuneSubsirCrescatorMaximal = ConstruireSubsirCrescatorMaximal(sirNumere, subsirCrescatorMaximal,
        pozitiiSubsirCrescatorMaximal, dimensiuneSirNumere);

    ScrieOutput(sirNumere, subsirCrescatorMaximal, pozitiiSubsirCrescatorMaximal, dimensiuneSubsirCrescatorMaximal);

    return 0;
}