Cod sursa(job #954148)

Utilizator AplayLazar Laurentiu Aplay Data 28 mai 2013 12:53:50
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <stdlib.h>

void read(int *n, int **numbers);
void subsir(int *numbers, const int n);

int main() {
    int n, *numbers;

    read(&n, &numbers);
    subsir(numbers, n);

    return 0;
}


void read(int *n, int **numbers) {
    int i;
    FILE *input;
    if( (input = fopen("scmax.in", "r")) == NULL) {
        perror("Nu se poate deschide fisierul ");
        exit(1);
    }
    fscanf(input, "%d", n);

    (*numbers) = (int*)calloc(*n, sizeof(int));
    for(i = 0; i < *n; ++i) {
        fscanf(input, "%d", (*numbers + i));
    }
    fclose(input);
}

void subsir(int *numbers, const int n) {
    FILE *output;
    if( (output = fopen("scmax.out", "r")) == NULL) {
        perror("Nu se poate deschide fisierul ");
        exit(1);
    }
    int L[n], maxim, k, i;
    L[n-1] = 1;
    for(k = n - 2; k >= 0; --k) {
        maxim = 0;
        for(i = k + 1; i < n; ++i)
            if(numbers[i] > numbers[k] && L[i] > maxim)
                maxim = L[i];
        L[k] = 1 + maxim;
    }

    maxim = L[0]; i = 0;
    for(k = 1; k < n; ++k)
        if(L[k] > maxim) {
            maxim = L[k];
            i = k;
    }

    fprintf(output,"%d\n%d", maxim, numbers[i]);
    for(k = i + 1; k < n; ++k)
        if(numbers[k] > numbers[i] && L[k] == maxim - 1) {
            fprintf(output," %d", numbers[k]);
            --maxim;
        }
}