Pagini recente » Cod sursa (job #2932242) | Cod sursa (job #1346477) | Cod sursa (job #1009275) | Cod sursa (job #1713236) | Cod sursa (job #204105)
Cod sursa(job #204105)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 5000
int n,v[NMAX+1],w[NMAX+1];
int l[NMAX+1],next[NMAX+1],pf[NMAX+1];
int min,max;
int fcmp(const void*a, const void*b){
if(*(int*)a>*(int*)b) return 1;
else if(*(int*)a<*(int*)b) return -1;
else return 0;
}
int main(){
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
int n,m,i,j,k,pumax,ppmin,lmax,lc,lmin;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&v[i]);
w[i]=v[i];
}
qsort(w,n+1,sizeof(w[0]),fcmp);
m=1;
for(i=2;i<=n;++i)
if(w[i]!=w[i-1]) {m++;w[m]=w[i];}
min=w[1],max=w[m];
pumax=n;
while(v[pumax]!=max) pumax--;
ppmin=1;
while(v[ppmin]!=min) ppmin++;
l[pumax]=1;
for(i=pumax-1;i>=ppmin;--i){
lmax=0;
for(j=i+1;j<=pumax;++j)
if(v[i]<v[j])
if(lmax<l[j])
{lmax=l[j];next[i]=j;}
else if(lmax==l[j]&&v[next[i]]>v[j]) next[i]=j;
l[i]=lmax+1;
}
int first;
lmax=0;
for(i=ppmin;i<=pumax;++i)
if(lmax<l[i]) {lmax=l[i];first=i;}
if(lmax<m) {printf("-1");return 0;}
k=0;
for(i=first;i<=pumax;++i)
if(lmax==l[i]) k++,pf[k]=i;
int pi,pu;
lmin=n;
for(i=1;i<=k;++i){
pi=pf[i];
j=pi;
while(next[j]) {
j=next[j];
}
pu=j;
lc=pu-pi+1;
if(lmin>lc) lmin=lc;
}
printf("%d",lmin);
return 0;
}