Pagini recente » Cod sursa (job #2892557) | Cod sursa (job #2313730) | Cod sursa (job #826922) | Cod sursa (job #1012312) | Cod sursa (job #18781)
Cod sursa(job #18781)
/*
Author:Tabara Mihai
Lang: C++
Punctaj: 100 puncte
Problema: "Secv" - http://infoarena.ro/
*/
#include <stdio.h>
#define in "secv.in"
#define out "secv.out"
#define _INF_ 1000000000
#define NMAX 5001
int n, m;
int t[NMAX], a[NMAX], c[NMAX];
int nrsol, aux;
void QSort(int,int);
int main()
{
freopen( in, "r", stdin );
freopen ( out, "w", stdout );
int i, j, k;
scanf( "%d", &n );
for ( i = 0; i < n; ++i )
{
scanf( "%d", &a[i] );
t[i] = a[i];
}
QSort( 0, n-1 );
c[0] = t[0];
m++;
for ( i = 1; i < n; ++i )
{
if ( t[i] != t[i-1] ) c[m++] = t[i];
}
nrsol = _INF_;
//am construit pana aici sirul C al sirului crescator din sirul initial
for ( i = n - 1; i >= 0; --i )
{
if ( a[i] == c[m-1] ) //daca ultima pozitie coincide
{
k = i;//retin unde e i-ul
for ( j = m - 2; j >= 0; --j )
{
while ( k >= 0 && a[k] != c[j] ) k--;
if ( k < 0 ) break;
}
if ( j == - 1 && nrsol > i - k + 1 ) nrsol = i - k + 1;
}
}
printf( "%d\n", nrsol == _INF_ ? -1 : nrsol );
}
void QSort(int st,int dr)
{
int i = st - 1, j = dr + 1;
int pivot = t[st];
do
{
do { i++; } while ( t[i] < pivot );
do { j--; } while ( t[j] > pivot );
if ( i <= j )
{
aux = t[i];
t[i] = t[j];
t[j] = aux;
}
} while ( i <= j );
if ( i < dr ) QSort( i, dr );
if ( st < j ) QSort( st, j );
}