Cod sursa(job #2643)

Utilizator buhabuha buha Data 18 decembrie 2006 16:16:57
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>

long tmp[5001];

void qsort(long st,long dr)
 {
  register long i=st,j=dr,sc=tmp[(st+dr)>>1],aux;
    do{
      while(tmp[i]<sc)
       ++i;
      while(tmp[j]>sc)
       --j;
      if(i<=j)
       {
         aux=tmp[i];
         tmp[i]=tmp[j];
         tmp[j]=aux;
         ++i;--j;
       }
     }while((i<=j));
     
if(i<dr)qsort(i,dr);
if(j>st)qsort(st,j);
 }

int main()
 {
   freopen("secv.in","r",stdin);
   freopen("secv.out","w",stdout);

   register long x[5001], v[5001], d[5001], n;
   register long i, j;
   register long nr=0 , max=9999;

   scanf("%ld",&n);
   for(i=1;i<=n;++i)
    {
     scanf("%ld",&v[i]);
     tmp[i]=v[i];
    }

   qsort(1,n);

   tmp[0]=-1;
   for(i=1;i<=n;++i)
    if(tmp[i-1]^tmp[i])
     ++nr;

   for(i=1;i<=n;++i)
    {
     x[i]=(v[i]==tmp[1]);
     d[i]=(v[i]!=tmp[1])*10000+1;
     for(j=1;j<i;++j)
      if(x[j]>=x[i] && v[j]<v[i])
       {
         x[i]=x[j]+1;
         d[i]=d[j]+i-j;
       }
     if(x[i]==nr && d[i]<max)
      max=d[i];
    }

   printf("%ld\n",(max^9999)?max:-1);

   return 0;
 }