Pagini recente » Cod sursa (job #11160) | Cod sursa (job #724619) | Cod sursa (job #542201) | Cod sursa (job #916883) | Cod sursa (job #1096281)
#include <stdio.h>
#include<algorithm>
const int nmax = 5300;
using namespace std;
int a[nmax],n,maxime[nmax],drum[nmax],pr[20000000],nr=0;
int pozitia(int k){
if(maxime[k]==1)return k;
return pozitia(drum[k]);
}
int numarul(int k){
if(maxime[k]==1)return 1;
return (numarul(drum[k])+1);
}
main(){
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
scanf("%d ",&n);
for(int i=1;i<=n;i++){
scanf("%d ",&a[i]);
if(pr[a[i]]!=1)nr++;
pr[a[i]]=1;
}
maxime[n]=1;drum[n]=-1;
int max = n;
for(int i=n-1;i>0;i--){
maxime[i]=1;drum[i]=-1;
for(int j=i+1;j<=n;j++)
if(a[i]<a[j] && maxime[i]<maxime[j]+1){
maxime[i]=maxime[j]+1;
drum[i]=j;
if(maxime[max]<maxime[i])max=i;
}
}
//for(int i=1;i<=n;i++)printf("%d ",maxime[i]);printf("\n");
//for(int i=1;i<=n;i++)printf("%d ",drum[i]);printf("\n");
int mm = 100000000;
int sf ,ok=0,nn;
for(int i=1;i<=n;i++){
if(maxime[max]==maxime[i]){
sf = pozitia(i);
nn = numarul(i);
if(sf-i+1<mm && nn==nr){
mm=sf-i+1;
if(nn==nr)ok=1;
}
}
}
if(ok==0)mm=-1;
printf("%d",mm);
}