Cod sursa(job #828681)

Utilizator plusplusRares M. plusplus Data 4 decembrie 2012 08:38:59
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#define val -1
#define NMAX 5005
#define INF (1 << 20)

int N, K;
int L[NMAX], A[NMAX], T[NMAX], P[NMAX];

FILE *fin = fopen("secv.in", "r");
FILE *fout = fopen("secv.out", "w");

void ReadData() {
    int i;
    fscanf(fin, "%d", &N);
    for(i = 1; i <= N; ++ i) fscanf(fin, "%d", &A[i]);
}

void dis() {
    int i, j;
    bool ok;
    P[++ K] = A[1];
    for(i = 2; i <= N; ++ i) {
        ok = true;
        for(j = 1; j <= K; ++ j)
            if(A[i] == P[j]) {
                ok = false;
                j = K + 2;
            }
        if(ok) P[++ K] = A[i];
    }
}

void Solve() {
    bool p = false;
    int i, j, xmin, poz;
    dis();
    L[1] = 1; T[1] = 1;
    for(i = 2; i <= N; ++ i) {
        L[i] = 1;
        T[i] = i;
        xmin = val;
        for(j = i - 1; j >= 1; -- j)
            if(xmin < L[j] && A[j] < A[i]) xmin = L[j], poz = j;
        if(xmin != val) {
            L[i] = xmin + 1;
            T[i] = T[poz];
        }
    }
    xmin = INF;
    for(i = 1; i <= N; ++ i) {
        if(L[i] == K) p = true;

        if(p && L[i] == K && xmin > i - T[i] + 1)
            xmin = i - T[i] + 1;
    }

    if(p) {
        fprintf(fout, "%d\n", xmin);
        return;
    } else {
        fprintf(fout, "-1\n");
        return;
    }
}

int main() {
    ReadData();
    Solve();
    return 0;
}