Cod sursa(job #650290)

Utilizator dcarbunescucarbunescu dcarbunescu Data 17 decembrie 2011 19:20:48
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.11 kb
#include <stdio.h>
#include <conio.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, m_mare = -1;

    //metoda de cautare binara
    if(vector[curent] <= vector[L[dr]])
        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;
            }
            else
             if(vector[curent]==vector[L[mij]]){
                  //printf("egal");
                  break;
             }
             else{
                 //printf("mai mare");
                 m_mare = 1;
                 st = mij+1;
             }

             //getch();
         }while(st<dr_temp);
    else
        mij = dr;

    //printf("\ndr: %i", dr);
    if(m_mare != 0){
        //printf("intra aici");
        dr = ++mij;
        return mij;
    }

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

    return mij;
}

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, sizeof(int));//de cine se leaga
    best = (int*)calloc(n, sizeof(int));//cel mai lung subsir crescator
    L = (int*)calloc(n, 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];
        best[curent] = poz;

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

        curent++;
    }

    //afisare( n, vector);
    //afisare( n, p);
    //afisare( n, best);
    //afisare( n, 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;
}