Pagini recente » Cod sursa (job #1501658) | Cod sursa (job #236698) | Cod sursa (job #684945) | Cod sursa (job #3145325) | Cod sursa (job #2651889)
#include <fstream>
#include <algorithm>
#include <climits>
#include <unordered_map>
using namespace std;
const int NMAX = 5000;
int v[1 + NMAX];
int last[1 + NMAX];
int dp[1 + NMAX];
int lsir;
int c[1 + NMAX];
unordered_map<int, int> hm;
int main()
{
ifstream in("secv.in");
ofstream out("secv.out");
int n;
int minim = INT_MAX;
in >> n;
for (int i = 1; i <= n; i++)
{
in >> v[i];
dp[i] = INT_MAX;
last[i] = INT_MAX;
if (hm.find(v[i]) == hm.end())
{
hm.emplace(v[i], v[i]);
lsir++;
c[lsir] = v[i];
}
}
// Normalizare
sort(c + 1, c + 1 + lsir);
for (int i = 1; i <= lsir; i++)
{
hm[c[i]] = i;
}
for (int i = 1; i <= n; i++)
{
v[i] = hm[v[i]];
}
for (int i = 1; i <= n; i++)
{
last[v[i]] = i;
if (v[i] == 1)
{
dp[v[i]] = 1;
continue;
}
int pred = v[i] - 1;
int pos_pred = last[pred];
if (pos_pred < i && dp[pred] != INT_MAX)
{
dp[v[i]] = dp[pred] + i - pos_pred;
if (v[i] == lsir)
{
minim = min(minim, dp[v[i]]);
}
}
}
if (lsir == 1)
{
minim = 1;
}
if (minim == INT_MAX)
out << -1 << '\n';
else
out << minim << '\n';
return 0;
}