Pagini recente » Cod sursa (job #1597294) | Cod sursa (job #2838890) | Cod sursa (job #2711760) | Cod sursa (job #533909) | Cod sursa (job #2593444)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 5000
using namespace std;
ifstream f("secv.in");
ofstream g("secv.out");
int n, v[NMAX+10], a[NMAX+10], dp[NMAX+10], dp1[NMAX+10], sol[NMAX+10], last[NMAX+10], ans, k, nr;
int binSearch(int val)
{ int st = 1, dr = k, sol = 0;
while(st <= dr)
{ int mij = (st + dr) / 2;
if(val <= dp[mij]) sol = mij, dr = mij - 1;
else st = mij + 1;
}
return sol;
}
int main()
{
f >> n;
for(int i=1; i<=n; i++) f >> v[i], a[i] = v[i];
sort(a+1, a+n+1);
nr = 1;
for(int i=2; i<=n; i++) if(a[i] != a[i-1]) nr++;
dp[++k] = v[1];
sol[1] = 1;
for(int i=2; i<=n; i++)
{ if(v[i] > dp[k]) dp[++k] = v[i], sol[i] = k;
else
{ int poz = binSearch(v[i]);
dp[poz] = v[i];
sol[i] = poz;
}
}
if(k < nr)
{ g << -1 << '\n';
return 0;
}
if(k == 1)
{ g << 1 << '\n';
return 0;
}
ans = 5005;
for(int i=1; i<=n; i++)
{ if(sol[i] == 1) last[1] = i, dp1[i] = 1;
else
{ last[sol[i]] = i;
if(last[sol[i]-1]) dp1[i] = dp1[last[sol[i]-1]] + i - last[sol[i]-1];
if(sol[i] == nr) ans = min(ans, dp1[i]);
}
}
g << ans << '\n';
return 0;
}