Pagini recente » Cod sursa (job #2270456) | Cod sursa (job #235043) | Cod sursa (job #77587) | Cod sursa (job #1040362) | Cod sursa (job #80012)
Cod sursa(job #80012)
#include<stdio.h>
long int n,i,a[5002],o[5002],aux,sol,pc,lev,p[5002],u[5002],l[5002],m[5002],p1,p2,u1,u2;
void heapdown(long int ic,long int nc);
void swap(long int i1,long int i2);
int main()
{
FILE *f,*g;f=fopen("secv.in","r");g=fopen("secv.out","w");
fscanf(f,"%ld",&n);for(i=1;i<=n;i++){ fscanf(f,"%ld",&a[i]);o[i]=i;m[i]=10;}
for(i=n/2;i>=1;i--)heapdown(i,n);for(i=n;i>=1;i--){ swap(1,i);heapdown(1,i-1);}
pc=1,lev=1;l[1]=1;
for(i=2;i<=n;i++){ if(a[i]>a[i-1]){p[lev]=pc;u[lev]=i-1;pc=i;lev++;}l[i]=lev;}p[lev]=pc;u[lev]=n;
for(i=p[1];i<=u[1];i++)
m[i]=1;
for(i=2;i<=lev;i++)
{ p1=p[i-1];p2=p[i];
u1=u[i-1];u2=u[i];
while(p1<=u1&&p2<=u2)
{ while(o[p1]>o[p2])p2++;
if(p2<=u2)
if(m[p2]>m[p1]+o[p2]-o[p1])m[p2]=m[p1]+o[p2]-o[p1];
p1++;
}
}
sol=10000;
for(i=p[lev];i<=u[lev];i++)
sol=(sol<m[i])?sol:m[i];
if(sol==10000)sol=-1;
fprintf(g,"%ld\n",sol);
fcloseall();
return 0;
}
void heapdown(long int ic,long int nc)
{
long int is,is1;
is=2*ic;is1=2*ic+1;
if(is>nc) return;
if(is<nc)
{ if(a[is1]>a[is]) is=is1;
else if(a[is1]==a[is]&&o[is1]>o[is]) is=is1;
}
if(a[is]>a[ic]){swap(is,ic);heapdown(is,nc);return;}
if(a[is]==a[ic]&&o[is]>o[ic]){swap(is,ic);heapdown(is,nc);}
}
void swap(long int i1,long int i2)
{
aux=a[i1];a[i1]=a[i2];a[i2]=aux;
aux=o[i1];o[i1]=o[i2];o[i2]=aux;
}