Cod sursa(job #300575)

Utilizator DraStiKDragos Oprica DraStiK Data 7 aprilie 2009 15:24:27
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <algorithm>
#define DIM 5005
#define INF 1<<31-1
using namespace std;
struct secv {int v,x,ap,in;} a[DIM];
int n,mins;
void read ()
{
    int i;
    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
    {
        scanf ("%d",&a[i].v);
        a[i].in=i;
    }
}
int cmp (secv a,secv b)
{
    return a.v<b.v;
}
void solve ()
{
    int i,j,last;
    for (i=1; i<=n; ++i)
        if (a[i].v>a[1].v)
            break;
        else
            a[i].ap=a[i].x=1;
    last=i-1;
    for ( ; i<=n; ++i)
    {
        a[i].x=INF;
        for (j=last; a[j].v==a[last].v; --j)    
            if (a[i].in>a[j].in && a[j].ap)
            {
                a[i].ap=1;
                if (a[i].in-a[j].in+a[j].x<a[i].x)
                    a[i].x=a[i].in-a[j].in+a[j].x;
            }
        if (a[i].x==INF)
            a[i].x=-1;
        if (a[i+1].v>a[i].v)
            last=i;
    }
    for (i=n, mins=INF; a[i].v!=a[last].v; --i)
        if (a[i].ap && a[i].x<mins)
            mins=a[i].x;
    printf ("%d",mins==INF?-1:mins);
}
int main ()
{
    freopen ("secv.in","r",stdin);
    freopen ("secv.out","w",stdout);
    read ();
    if (n==1)
    {
        printf ("1");
    }
    else
    {
        sort (a+1,a+n+1,cmp);
        solve ();
    }
    return 0;
}