Cod sursa(job #1904464)

Utilizator danutmafteiMaftei Danut danutmaftei Data 5 martie 2017 16:09:09
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#define MAX 100001
#include <limits.h>
#include <fstream>

using namespace std;

int n,a[MAX],B[MAX],P[MAX],s[MAX],L[MAX],maxim,nr;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

void afis(int i)
{
    if(P[i]>0)afis(P[i]);
    fout<<a[i]<<" ";
}

void citire(int &n,int a[])
{    fin>>n;
    for(int i=1;i<=n;++i)
        fin>>a[i];

}

int caut(int x)
{int li,ls,m;
li=0;ls=nr;m=(li+ls)/2;

while(li<=ls)
{
    if(a[L[m]]<x && a[L[m+1]]>=x) return m;
    else if(a[L[m+1]]<x)li=m+1,m=(li+ls)/2;
    else ls=m-1,m=(li+ls)/2;
}
return nr;

}

void calcul(int a[])
{int i,poz;
nr=1;
B[1]=1;L[1]=1;L[0]=0;
for(int i=2;i<=n;++i)
   {poz=caut(a[i]);
   P[i]=L[poz];
   B[i]=poz+1;
   L[poz+1]=i;
   if(nr<poz+1)nr=poz+1;

   }
   maxim=0;poz=0;
   for(i=1;i<=n;++i)
    if(maxim<B[i])maxim=B[i],poz=i;

   fout<<maxim<<endl;
   afis(poz);
}


int main()
{
    citire(n,a);
    calcul(a);
    return 0;
}