Cod sursa(job #53367)

Utilizator info_arrandrei gigea info_arr Data 21 aprilie 2007 21:31:18
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
using namespace std;
#include<stdio.h>
#define nmax 5050
#define infinit 10000

FILE *fin=fopen("secv.in","r"),
     *fout=fopen("secv.out","w");
 
long c[nmax],a[nmax],s[nmax]; 
int i,j,k,n,aux,min,sol;
        
void sort()
{
  for(i=1;i<=n;i=i+1) 
  {
  j=i;
  while(j/2 && a[j/2]<a[j]) 
     {
     aux=a[j/2];
     a[j/2]=a[j];
     a[j]=aux;

     j=j/2;
     }
  }

i=n;
while(i>1)
  {
  aux=a[1];
  a[1]=a[i];
  a[i]=aux;
  i=i-1; 

  j=1;
  while(1) 
    {
    k=2*j;
    if(k>i) break; 
    if(k+1<=i && a[k+1]>a[k]) k=k+1;
    if(a[j] >= a[k]) break;

    aux=a[j];
    a[j]=a[k];
    a[k]=aux;

    j=k;
    }
  }   
}     

void solve()
{
 int i,j,k,p,len;
 s[1]=a[1];
 p=2;
 for (i=2; i<=n; i++)
  { if (s[p-1]<a[i]) { s[p]=a[i]; p++; } }
 len=p-1;
 for (i=1; i<=n-len+1; i++)
  {
   if (a[i]==min)
    {
     p=1; j=i;
     while (p<len)
      {
       j++;
       if (s[p+1]==a[j]) p++;
       if (p==len) break;
      }
     if (j-i+1<sol) sol=j-i+1;
    } 
  }    
}           
       


int main()
{
  fscanf(fin,"%d\ns",&n);
  for (i=1; i<=n; i++){
   fscanf(fin,"%d",&c[i]); a[i]=c[i]; }
  sort();
  sol=infinit;
  min=a[1];
  solve();
  fprintf(fout,"%d",sol);
  fclose(fin);
  fclose(fout);
  return 0;
}