Pagini recente » Cod sursa (job #1161076) | Cod sursa (job #827788) | Cod sursa (job #1069795) | Cod sursa (job #1387205) | Cod sursa (job #1327064)
#include <fstream>
#include <algorithm>
#include <vector>
#define MAXN 5000
using namespace std;
struct nr{
int val, pos;
};
typedef vector <int> list;
nr v[MAXN + 1];
int D[MAXN + 1];
list P[MAXN + 1];
bool comp_val(nr a, nr b) {
return a.val < b.val;
}
bool comp_pos(nr a, nr b) {
return a.pos < b.pos;
}
int main () {
ifstream cin("secv.in");
ofstream cout("secv.out");
int n;
cin >> n;
for (int i = 0 ; i < n ; ++i) {
cin >> v[i].val;
v[i].pos = i;
}
sort(v, v + n, comp_val);
int x = v[0].val, normal = 0;
for (int i = 0 ; i < n ; ++i) {
if (v[i].val == x)
v[i].val = normal;
else {
++normal;
x = v[i].val;
v[i].val = normal;
}
}
sort(v, v + n, comp_pos);
int maxval = -1, sol = 0;
for (int i = 0 ; i < n ; ++i) {
P[v[i].val].push_back(i);
if (v[i].val == 0)
D[i] = 1;
else {
int want = v[i].val - 1;
int minlen = 0, p;
for (int j = 0 ; j < P[want].size() ; ++j)
if (D[P[want][j]] > 0 && (minlen == 0 || D[P[want][j]] + (i - P[want][j]) < minlen)) {
minlen = D[P[want][j]] + (i - P[want][j]);
p = P[want][j];
}
if (minlen) D[i] = minlen;
}
if (v[i].val > maxval) {
maxval = v[i].val;
sol = D[i];
}
else if (v[i].val == maxval && (D[i] < sol || sol == 0)) {
sol = D[i];
}
}
if (sol) cout << sol << "\n";
else
cout << "-1\n";
return 0;
}