Cod sursa(job #650238)

Utilizator dcarbunescucarbunescu dcarbunescu Data 17 decembrie 2011 17:23:19
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.27 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;

    //metoda de cautare binara
    if(vector[curent]<= vector[L[dr]])
        do
        {
            m_mare = 0;
            mij = (st+dr_temp)/2;
            //printf(" curent:%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("Elementul a fost gasit pe pozitia %i",mij);
                  //ok=1;
                  //printf("egal");
                  break;
             }
             else{
                 //printf("mai mare");
                 m_mare = 1;
                 st = mij+1;
             }

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

    //printf(" i_ret= %i ",mij);
    if(m_mare){ dr = ++mij; return mij;}
    //trebuie pus si p - de cine se leaga elementul curent

    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;

    //cel mai lung sir este best[i-1]
    //caut elementul curent
    while( curent <= n){

        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]);
        //printf("\n");
        //best[curent] = i;

        //    break;

        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;
}