Cod sursa(job #368148)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 24 noiembrie 2009 00:51:49
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define N 5001
int sir[N];
int sir2[N];
int sir3[N];
int cost[N];
void sort(int st,int dr)
{int i;
 int s=st,d=dr,aux,p=sir2[st+rand()%(dr-st+1)];
 while(s<d)
 {while(sir2[s]<p)s++;
  while(sir2[d]>p)d--;
  if(s<=d)
  {aux=sir2[s];sir2[s]=sir2[d];sir2[d]=aux;
   s++;
   d--;
  }
 }
 if(s<dr)sort(s,dr);
 if(st<d)sort(st,d);
}

int main ()
{freopen("secv.in","r",stdin);
 freopen("secv.out","w",stdout);
 int n,i,j,k,vf,st,dr,mij;
 scanf("%d",&n);
 for (i=1;i<=n;i++)
 {scanf("%d",&sir[i]);
 }
 memcpy(sir2,sir,sizeof(*sir)*(n+1));
 sort(1,n);
 vf=1;
 for (i=2;i<=n;i++)
 {if(sir2[vf]!=sir2[i])
  {sir2[vf+1]=sir2[i];
   vf++;
  }
 }
 for (i=1;i<=n;i++)
 {for (j=1;j<=vf;j++)
  {if(sir[i]==sir2[j])
   {sir3[i]=j;
    break;
   }
  }
 }
 for (i=1;i<=n;i++)
 {if(sir3[i]==1)cost[i]=i;
 }
 
 for (i=2;i<=n;i++)
 {for (j=i-1;j>=1;j--)
  {if(sir3[i]==sir3[j]+1)
   {cost[i]=cost[j];
    break;
   }
  }
 }
 int min=123456789;
 for (i=1;i<=n;i++)
 {if(sir3[i]==vf)
  {if(min>i-cost[i]+1)
   {min=i-cost[i]+1;
   }
  }
 }
 if(min==123456789)
 {printf("-1");
 }
 else
 {printf("%d",min);
 }
 return 0;
}