Pagini recente » Cod sursa (job #338832) | Cod sursa (job #54230) | Cod sursa (job #1940838) | Cod sursa (job #1032140) | Cod sursa (job #1729997)
#include <cstdio>
#include <algorithm>
#define NMax 5005
#define INF 1<<30
using namespace std;
int sum[NMax];
int pos[NMax];
int e[NMax];
int v[NMax];
int start,n;
void Prelucrare()
{
// Prelucram sirul
int i,j,st,mid,dr;
sort( e + 1, e + 1 + n );
for( i = 1; i <= n; )
{
for( j = i + 1; j <= n && e[i] == e[j]; ++j )
e[j] = -1;
i = j;
}
sort( e + 1, e + 1 + n );
start = 1;
while( e[start] == -1 ) ++start;
--start;
for( i = 1; i <= n; ++i )
for( st = start + 1, dr = n; st <= dr; )
{
mid = (st + dr)/2;
if( v[i] > e[mid] ) st = mid + 1;
else if( v[i] < e[mid] ) dr = mid - 1;
else { v[i] = mid - start; break; }
}
}
int main(){
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
int i,ans=INF,ok;
scanf("%d",&n);
for( i = 1; i <= n; ++i )
{
scanf("%d",&v[i]);
e[i] = v[i];
}
Prelucrare();
for( i = 1; i <= n; ++i )
{
if( v[i] == 1 ) pos[ v[i] ] = i;
else if( pos[ v[i] - 1 ] )
{
pos[ v[i] ] = i;
sum[i] = pos[ v[i] ] - pos[ v[i] - 1 ] + sum[ pos[ v[i] - 1 ] ];
}
}
for( ok = 0, i = 1; i <= n; ++i )
if( ans > sum[i] + 1 && v[i] == n - start && sum[i] )
{ ans = sum[i] + 1; ok = 1; }
if( n - start == 1 ) printf("1\n");
else if( !ok ) printf("-1\n");
else printf("%d\n",ans);
return 0;
}