Cod sursa(job #72315)

Utilizator a7893Nae Mihai a7893 Data 13 iulie 2007 13:20:30
Problema Secv Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10000
int n,v[N],c[N],s[N],k=1;
void read()
{
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
}
int exist(int x)
{
	int i;
	for(i=1;i<=k;i++)
		if(c[i]==x)
			return 1;
	return 0;
}
int maxim(const void *a,const void *b)
{
	return *(int*)a-*(int*)b;
}
void sort(int c[N])
{
	int i,ok,aux;
	do{
		ok=0;
		for(i=1;i<k;i++)
			if(c[i]>c[i+1])
			{
				aux=c[i];
				c[i]=c[i+1];
				c[i+1]=aux;
				ok=1;
			}
	}while(ok);
}
void reconstruct()
{
	int i;
	c[k++]=v[1];
	for(i=2;i<=n;i++)
		if(!exist(v[i]))
			c[k++]=v[i];
	qsort(c,k,sizeof(c[1]),maxim);
	k--;
	//sort(c);
}
int caut(int x,int poz)
{
	int i,ok=1;
	for(i=poz;i<=n&&ok;i++)
	{
		if(v[i]==x)
		{
			poz=i;
			ok=0;
		}
	}
	if(ok==1)
		return -1;
	return poz;
}
void solve()
{
	int i,poz1,poz,min=N*N,nr=0,ok=1;
	reconstruct();
	//afis(c,k);
	for(poz1=1;poz1<=n;poz1++)
		if(v[poz1]==c[1])
		{
			nr=poz1;
			poz=poz1;
			ok=1;
			for(i=2;i<=k&&ok;i++)
			{
				poz=caut(c[i],poz);
				if(poz==-1)
					ok=0;
			}
			if(ok)
			{
				nr=poz-nr+1;
				if(nr<min)
					min=nr;
			}
		}
	if(min!=N*N)
		printf("%d\n",min);
	else
		printf("%d\n",-1);
}
int main()
{
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);
	read();
	solve();
	return 0;
}