Cod sursa(job #1856358)

Utilizator zhm248Mustatea Radu zhm248 Data 24 ianuarie 2017 19:48:46
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct doi
{
    int x,y;
};
doi v[5005],v1[5005];
int v2[5005];
bool cmp(doi a,doi b)
{
    return a.x<b.x;
}
int main()
{
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    int n,i,nr=0,j,val=0,l,minim=5001;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&v[i].x);
        v1[i].x=v[i].x;
        v1[i].y=i;
    }
    sort(v1+1,v1+n+1,cmp);
    v1[0].x=-1;
    for(i=1;i<=n;++i)
    {
        if(v1[i].x!=v1[val].x)
        {
            val=i;
            nr++;
        }
        v[v1[i].y].y=nr;
    }
    for(i=1;i<=n;++i)
    {
        if(v[i].y!=nr)
        {
            for(j=i+1;j<=n;++j)
            {
                if(v[j].y==v[i].y+1)
                {
                    v2[i]=j-i;
                    break;
                }
            }
        }
        if(!v2[i])
            v2[i]=5001;
    }
    for(i=1;i<=n;++i)
    {
        if(v[i].y==1)
        {
            j=i;
            l=1;
            while(j<=n&&v[j].y<nr)
            {
                l+=v2[j];
                j+=v2[j];
            }
            if(j<=n&&v[j].y==nr&&l<minim)
                minim=l;
        }
    }
    if(minim==5001)
        printf("-1\n");
    else
        printf("%d\n",minim);
    return 0;
}