Pagini recente » Cod sursa (job #2167915) | Cod sursa (job #2210704) | Cod sursa (job #2163486) | Cod sursa (job #1101193) | Cod sursa (job #1537338)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
const int Nmax = 100;
int N;
int V[100], Q[100], P[100], SOL[100];
ofstream fout("scmax.out");
void read()
{
ifstream f("scmax.in");
f >> N;
for ( int i = 1; i <= N; ++i )
f >> V[i];
f.close();
}
int cautare( int key )
{
int st = 1, dr = Q[0], gasit = -1;
while ( st <= dr )
{
int m = ( st + dr ) / 2;
if ( Q[m] >= key ) /// am gasit un Q[m] mai mare decat key
{
gasit = m;
dr = m - 1; /// caut unul mai mic
}
else /// Q[m] este mai mic decat key
{
st = m + 1; /// caut unul mai mare
}
}
return gasit;
}
void SCM()
{
for ( int i = 1; i <= N; ++i )
{
int poz = cautare( V[i] ); /// caut binar in Q
/// cel mai mic element
/// mai mare decat V[i]
if ( poz == -1 ) /// V[i] este mai mare decat tot vect Q
{
Q[0]++; /// cresc dimensiunea subsirului maximal
Q[ Q[0] ] = V[i]; /// pun V[i] in Q
P[i] = Q[0]; /// setez faptul ca V[i] corespunde pozitiei Q[0]
}
else
{
Q[poz] = V[i]; /// inlocuiesc elementul gasit mai mare cu V[i]
P[i] = poz; /// setez faptul ca V[i] corespunde pozitiei poz
}
}
}
void drum()
{
fout << Q[0] << "\n"; /// afisez dimensiunea
int poz = N;
for ( int i = Q[0]; i >= 1; i-- ) /// pentru fiecare pozitie
/// a subsirului maximal
{
while ( P[poz] != i ) /// caut elementul ce corespunde pozitiei i
poz--;
SOL[i] = V[poz]; /// il adaug in solutie
}
for ( int i = 1; i <= Q[0]; ++i )
fout << SOL[i] << " ";
}
int main()
{
read();
SCM();
drum();
return 0;
}