Cod sursa(job #650650)

Utilizator dcarbunescucarbunescu dcarbunescu Data 18 decembrie 2011 16:58:55
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.53 kb
#include <stdio.h>
#include <stdlib.h>

int dr = 1;
//int best[1000] = {0};

void citire( int *n, int **vector)
{
    int i, j;
    int *sir;

    FILE *f = fopen( "scmax.in","rt");

    if( f == NULL){
        printf( "Fisierul nu poate fi deschis!!!");
        exit(0);
    }

    fscanf(f, "%i", n);
    //printf("{este%i}\n",*n);
    sir = (int*)calloc(*n+1, sizeof(int));

    for( i = 1; i <= *n; i++)
        fscanf(f,"%i", &sir[i]);

    *vector = sir;

    fclose( f);

    return;
}

void afisare(int n, int *vector)
{
    int i;

    printf("\n");
    for( i = 0; i < n; i++)
        printf(" %i", vector[i]);

    return;
}

int cauta( int curent, int n, int *vector, int *L, int* p)
{
    int i = 1, j, dr_temp = dr;
    int st = 1,mij = 1, m_mare = -1;

    //metoda de cautare binara
    //printf("\ncurent:%i,vector[curent]:%i, dr:%i, vector[L[dr]]:%i\n",curent, vector[curent],dr, vector[L[dr]]);
//
  //  if(vector[curent] > vector[L[dr]])
     //   mij = dr;
  //  else
        do
        {
            m_mare = 0;
            mij = (st+dr_temp)/2;
            //printf("\ncurent:%i,vector[curent]:%i, mij:%i, vector[L[mij]]:%i\n",curent, vector[curent],mij, vector[L[mij]]);
            if(vector[curent]<vector[L[mij]]){
                //printf("mai mic");
                dr_temp = mij-1;
            }
            else
             if(vector[curent]==vector[L[mij]]){
                  //printf("egal");
                  return mij;
             }
             else{
                 //printf("mai mare");
                 m_mare = 1;
                 st = mij+1;
             }

             //getch();
         }while(st<=dr_temp);

    //printf("\ndr: %i", dr);
 /*   if(m_mare == -1){
        //printf("intra aici");
        (++dr);
        return dr;
    }
    if(m_mare == 1){
        //printf("intra aici");
        dr_temp = (++mij);
        return mij;
    }

*/    //printf("\ni_ret= %i ",mij);

    return (st+dr_temp)/2+1;
}

int afis_rec( int poz, int *vector, int *p, FILE *f)
{
    //printf( " poz: %i", poz);
    //getch();
    if( poz != 0){
        afis_rec( p[poz], vector, p, f);

        fprintf( f, " %i", vector[poz]);
    }

    return 1;
}
int main()
{
    int i, j, n, m, curent, max = 0;
    int *vector, *p, *L, poz = 0, *best;
    FILE *f = fopen( "scmax.out", "wt");

    citire( &n, &vector);

    p = (int*)calloc(n + 1, sizeof(int));//de cine se leaga
    best = (int*)calloc(n + 1, sizeof(int));//cel mai lung subsir crescator
    L = (int*)calloc(n + 1, sizeof(int));//cel mai recent numar de lungime i

    best[1] = 1;
    curent = 2;
    L[1] = 1;L[2]=1;

    while( curent <= n){

        //caut elementul curent
        poz = cauta(curent, n, vector, L, p);
        L[poz] = curent;
        p[curent] = L[poz - 1];

        //max = best[1];
        //for(i = 1; i < curent; i++)
        //    printf("best: %i", best[i]);
            //if(best[i] > max) max = best[i];

        best[curent] = poz;

        //printf("\nL:");
        //for(j=1;j<=dr;j++)
        //    printf(" %i->%i",j,L[j]);

        curent++;
    }

    //afisare( n + 1, vector);
    //afisare( n + 1, p);
    //afisare( n + 1, best);
    //afisare( n + 1, L);

    max = best[1]; poz = 1;
    for(i = 2; i < curent; i++)
        if(best[i] > max){ max = best[i]; poz = i;}

    //printf("\n poz: %i, max: %i \n",poz,max);
    fprintf( f, "%i\n", max);

    afis_rec( poz, vector, p, f);

    fclose( f);
    return 0;
}