Pagini recente » Cod sursa (job #407739) | Cod sursa (job #1874547) | Cod sursa (job #1722302) | Cod sursa (job #460713) | Cod sursa (job #518069)
Cod sursa(job #518069)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("secv.in");
ofstream out("secv.out");
const int N=5002;
struct element{
int val, id;
};
int n, d[2][N];
element v[N];
vector <int> a[N];
int cmp( element a, element b)
{
if(a.val==b.val)
return (a.id<b.id);
return (a.val<b.val);
}
void MakeVector()
{
sort( v+1, v+n+1, cmp);
int poz=1;
a[1].push_back(v[1].id);
for( int i=2; i<=n; ++i)
{
if(v[i].val>v[i-1].val)
++poz;
a[poz].push_back(v[i].id);
}
n=poz;
}
void Read()
{
in >> n;
for( int i=1; i<=n; ++i)
{
v[i].id=i;
in >> v[i].val;
}
MakeVector();
}
void MakeFive( int i, int sz)
{
for( int j=0; j<sz; ++j)
d[i%2][j]=N+1;
}
void Solve()
{
int jsz, ksz;
for( int i=2; i<=n; ++i)
{
jsz=a[i-1].size();
ksz=a[i].size();
MakeFive(i, ksz);
for( int j=0; j<jsz; ++j)
{
for( int k=0; k<ksz; ++k)
if( a[i-1][j] < a[i][k] )
if( d[i%2][k] > d[(i-1)%2][j] + a[i][k]-a[i-1][j] )
d[i%2][k] = d[(i-1)%2][j] + a[i][k]-a[i-1][j];
}
}
int min=N+1;
jsz=a[n].size();
for( int i=0; i<jsz; ++i)
if(d[n%2][i]<min)
min=d[n%2][i];
if(min>N)
min=-2;
out << min+1 << "\n";
}
int main()
{
Read();
Solve();
return 0;
}