Cod sursa(job #285781)

Utilizator titusuTitus C titusu Data 22 martie 2009 22:09:56
Problema Subsir crescator maximal Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
/*
 * 
 * Determina subsirul crescator maximal folosid algoritmul clasic, de complexitate n*n
 * 
 * */
#include <stdio.h>
#include <stdlib.h>
#define DIM 100001
typedef int Vector[DIM];
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");

Vector v, p, q;
int n,L;

void afis(int v[], int n)
{
  for(int i=1;i<=n;i++)
    printf("%d ",v[i]);
  printf("\n");
}

void SCM()
{
  int i;
  q[L=1]=v[1];
  p[1]=1;
  for(i=2;i<=n;i++)
  {
    if(v[i]>q[L])
      q[++L] = v[i], p[i]=L; //v[i] este mai mare decat elementele din q[]
    else
    {
      //caut binar pozitia in q[] pentru v[i]
      int st=1, dr=L, poz;
      while(1)
      {
        poz=(st + dr) / 2;
        if(q[poz]<=v[i] && v[i]<q[poz+1])
        {
          poz++; break;
        }
        if(v[i]<q[poz])
          dr=poz-1;
        else
          st=poz+1;
      }
      q[poz]=v[i];
    }
  afis(q,L);
  }
  
}

void Afisare()
{
  fprintf(fout,"%d\n",L);
  int *sol=(int *) malloc((L+1)*sizeof(int)); // in sol[] voi memora elementele din subsirul solutie
  int j=n;
  for(int i=L;i;i--)
  {
    //caut in p[] ultima aparitie a lui i, aflata inaintea pozitiei k[capat+1];
    while(p[j]!=i) j--;
    sol[i]=v[j];
  }
  for(int i=1;i<=L;i++)
    fprintf(fout,"%d ",sol[i]);
}

void Citire()
{
  fscanf(fin,"%d",&n);
  for(int i=1;i<=n;i++)
    fscanf(fin,"%d",v+i);
}

int main()
{
  Citire();
  SCM();
  Afisare();
  return 0;
}