Pagini recente » Cod sursa (job #3242901) | Cod sursa (job #2757173) | Cod sursa (job #204270) | Cod sursa (job #1332708) | Cod sursa (job #1129556)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 5005
#define NNMAX 2000000005
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))
#define f first
#define s second
using namespace std;
typedef vector < int > ::iterator vii;
ifstream in ( "secv.in" );
ofstream out ( "secv.out" );
pair < int , int > DP[NMAX];
vector < int > B;
int A[NMAX] , N , Answer, Next[NMAX];
int main ( void )
{
int i , j ;
in >> N ;
for ( i = 1 ; i <= N ; ++i ) in >>A[i] , B.push_back( A[i] );
sort ( B.begin() , B.end() );
B.resize ( distance ( B.begin() , unique( B.begin() , B.end() )));
vii last_pos = B.end() ; --last_pos;
for ( i = 1 ; i <= N ; ++i )
{
for ( vii it = B.begin() ; it != B.end() ; ++it )
if( *it == A[i] )
{
Next[i] = *(it+1);
break;
}
}
for ( i = 0 ; i <= N and A[i+1] < *B.begin() ; ++i);
for (++i ; i <= N ; ++i )
{
if ( A[i] == *B.begin() ) DP[i].second = i , DP[i].first = 1 ;
for ( j = i + 1 ; j <= N ; ++j )
if ( A[j] == Next[i] )
{
DP[j].first = DP[i].first + 1;
DP[j].second = DP[i].second;
}
}
Answer = INF;
for ( i = 1 ; i <= N ; ++i )
if ( A[i] == *last_pos and DP[i].first == B.size() )
Answer = get_min( Answer , i - DP[i].second +1 );
out << ( Answer != INF ? Answer : -1) << "\n";
in.close();
out.close();
return 0 ;
}