Cod sursa(job #1783347)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 18 octombrie 2016 22:31:12
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia3-programaredinamica1 Marime 1.47 kb
#include <stdio.h>

int v[100000], lung[100000], poz[100000];
char frecv[100000];

int cautbin( int nr, int start, int stop ){
    int pivot=0;
    while( start<=stop ){
        pivot = ( start + stop ) / 2;
        if( lung[pivot]==nr )
            return pivot;
        else if( lung[pivot] > nr )
            stop = pivot - 1;
        else if( lung[pivot] < nr )
            start = pivot + 1;
    }
    return pivot;
}

int main()
{
    int n, i, pozi, poza;
    FILE *fin, *fout;
    fin = fopen( "scmax.in", "r" );
    fscanf( fin, "%d", &n);
    poza = -1;
    for( i=0; i<n; i++ ){
        fscanf( fin, "%d", &v[i] );
        pozi = cautbin( v[i], 0, poza );  ///cautam pozitia cea mai mica, mai mare decat elementul curent
        while( pozi<=poza && lung[pozi] < v[i] )
            pozi++;
        lung[pozi] = v[i];    ///retineme pe ce pozitie in vectorul pt lungime am pus variabila pt a putea
        poz[i] = pozi;           ///reconstruii subsirul de lungime maximala
        if( pozi>poza )
            poza = pozi;            ///lungimea vectorului lung[0/1][i] e chiar lungimea subsirului maximal
    }
    fclose( fin );
    fout = fopen( "scmax.out", "w" );
    fprintf( fout, "%d\n", poza+1 );
    pozi = poza;
    for( i=n-1; i>=0; i-- ){
        if( poz[i]==pozi ){
            frecv[i] = 1;
            pozi--;
        }
    }
    for( i=0; i<=n; i++ )
        if( frecv[i]==1 )
            fprintf( fout, "%d ", v[i] );
    fputc( '\n', fout );
    fclose( fout );
    return 0;
}