Pagini recente » Cod sursa (job #1518625) | Cod sursa (job #2215659) | Diferente pentru utilizator/robybrasov intre reviziile 69 si 70 | Istoria paginii runda/simularecls10_10/clasament | Cod sursa (job #1755239)
#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 + 5);
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 + 5);
vector<int> pozitiiSubsirCrescatorMaximal(dimensiuneSirNumere + 5, -1);
int dimensiuneSubsirCrescatorMaximal = ConstruireSubsirCrescatorMaximal(sirNumere, subsirCrescatorMaximal,
pozitiiSubsirCrescatorMaximal, dimensiuneSirNumere);
ScrieOutput(sirNumere, subsirCrescatorMaximal, pozitiiSubsirCrescatorMaximal, dimensiuneSubsirCrescatorMaximal);
return 0;
}