Pagini recente » Cod sursa (job #2380406) | Cod sursa (job #1745158) | Cod sursa (job #1109933) | Cod sursa (job #1131092) | Cod sursa (job #1183498)
#include <fstream>
#include <set>
#define I "secv.in"
#define O "secv.out"
#define DIM 5055
std::ifstream is (I);
std::ofstream os (O);
int N, V[DIM], D[DIM], Lmax, S[DIM], sol = (1<<20);
std::set<int> Sx;
int BKPT(int i, int j);
int main()
{
is >> N;
for (int i = 1; i <= N; ++i)
{
is >> V[i];
if (Sx.find(V[i]) == Sx.end())
Sx.insert(V[i]);
}
int k = 1;
for (std::set<int> :: iterator it = Sx.begin(); it != Sx.end(); ++it, ++k)
S[k] = *it;
for (int i = 1; i <= N; ++i)
{
D[i] = 1;
for (int j = i-1; j >= 1; --j)
if (V[j] < V[i] && D[j]+1 > D[i])
D[i] = D[j]+1;
if (D[i] > Lmax) Lmax = D[i];
}
if (Lmax != Sx.size())
{
os << -1;
}
else
{
int j = 0;
for (int i = 1; i <= N; ++i)
if (D[i] == Lmax && V[i] == S[Lmax])
{
j = BKPT(i, Lmax);
if (i-j+1 < sol)
sol = i-j+1;
}
}
if (sol == (1<<20))
os << -1;
else
os << sol;
is.close();
os.close();
}
int BKPT(int i, int j)
{
if (V[i] == S[1]) return i;
while (1)
{
if (V[i] == S[j-1] && D[i] == j-1) return BKPT(i, j-1);
--i;
}
};