Cod sursa(job #1816483)

Utilizator Coroian_DavidCoroian David Coroian_David Data 26 noiembrie 2016 15:42:35
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>

#include <algorithm>

using namespace std;

FILE *f, *g;

struct numere
{
    int lx, en;
};

numere  l[5001];

int n, v[5001], mn = 9999, cnt, dif[5001];

void readFile()
{
    f = fopen("secv.in", "r");

    fscanf(f, "%d", &n);

    int i, j;

    bool ok;

    for(i = 1; i <= n; i ++)
    {
        fscanf(f, "%d", &v[i]);

        dif[i] = v[i];
    }

    fclose(f);
}

void solve()
{
    int i, j, last;

    sort(dif + 1, dif + n + 1);

    last = dif[1];

    cnt = 1;

    for(i = 2; i <= n; i ++)
        if(last != dif[i])
            last = dif[i], cnt ++;

    l[n].lx = 1;
    l[n].en = n;

    for(i = n - 1; i >= 1; i --)
    {
        l[i].lx = 1;
        l[i].en = i;


        for(j = i + 1; j <= n; j ++)
        {
            if(v[i] < v[j])
            {
                if(l[i].lx < l[j].lx + 1)
                {
                    l[i].lx = l[j].lx + 1;

                    l[i].en = l[j].en;
                }
            }
        }
    }

    for(i = 1; i <= n; i ++)
    {
        if(l[i].lx == cnt)
        {
            if(l[i].en - i + 1 < mn)
                mn = l[i].en - i + 1;
        }
    }
}

void printFile()
{
    g = fopen("secv.out", "w");

    if(mn == 9999)
        mn = -1;

    fprintf(g, "%d\n", mn);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}