Cod sursa(job #165040)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 25 martie 2008 10:46:23
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <stdlib.h>
#define INF 2000000000
int comp(const void*a,const void*b){
	int *aa=(int*)a,*bb=(int*)b;
	int aaa=*aa,bbb=*bb;
	if(aaa<bbb) return -1;
	if(aaa>bbb) return 1;
	return 0;
}
int main(){
	int n,v[5006],l[5006]={0},i,j,minp,ll=INF,ok[5006],max=0,minu=INF,w[5006],m=0,k;
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&v[i]);
		w[i]=v[i];
		if(v[i]>max) max=v[i];
		if(v[i]<minu) minu=v[i];
	}
	qsort(w,n+1,sizeof(w[0]),comp);
	for(i=1;i<=n;i++)
		if(w[i]!=w[m]) w[++m]=w[i];
	for(i=1;i<=n;i++){
		l[i]=i;
		if(v[i]==max) ok[i]=1;
	}
	for(i=n-1;i>=1;i--){
		minp=INF;
		l[i]=INF;
		for(j=1;j<=m;j++)
			if(w[j]==v[i]) k=j;
		for(j=i+1;j<=n;j++)
			if(ok[j] && v[j]==w[k+1] && l[i]>l[j] && v[j]-v[i]<minp){
				minp=v[j]-v[i];
				l[i]=l[j];
				ok[i]=ok[j];
			}
		if(l[i]==INF) l[i]=-1;
	}
	for(i=1;i<=n;i++)
		if(ok[i] && v[i]==minu && ll>l[i]-i+1) ll=l[i]-i+1;
	if(ll!=INF) printf("%d",ll);
		else printf("-1");
	return 0;
}