Pagini recente » Cod sursa (job #1670294) | Cod sursa (job #1662210) | Cod sursa (job #214795) | Cod sursa (job #2623110) | Cod sursa (job #2294065)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <map>
#include <vector>
#define MAXN 5000
FILE *fin, *fout;
int v[MAXN + 1];
struct spec {
int val;
int pos;
bool operator< (spec B) {
if (val == B.val)
return pos < B.pos;
else
return val < B.val;
}
} v2[MAXN + 1];
int catastif[MAXN + 1];
int d[MAXN + 1];
bool vis[MAXN + 1];
std::map <int, int> mp;
std::vector <int> neighbors[MAXN + 1];
int k = 0;
void dfs(int nod);
int main() {
fin = fopen("secv.in", "r");
fout = fopen("secv.out", "w");
int N;
fscanf(fin, "%d", &N);
for(int i = 0; i < N; i++) {
fscanf(fin, "%d", &v[i]);
v2[i].val = v[i];
v2[i].pos = i;
}
std::sort(v2, v2 + N);
for(int i = 0; i < N; i++) {
if (catastif[v2[i].val] == 0) {
v[v2[i].pos] = ++k;
catastif[v2[i].val] = k;
} else {
v[v2[i].pos] = catastif[v2[i].val];
}
}
for(int i = 0; i < N; i++) {
for(int j = i + 1; j < N; j++) {
if(v[j] == (v[i] + 1)) {
neighbors[i].push_back(j);
}
}
}
for(int i = 0; i < N; i++) {
if(!vis[i]) {
vis[i] = 1;
dfs(i);
}
}
int ans = MAXN + 1;
for(int i = 0; i < N; i++) {
if(v[i] == 1) {
ans = std::min(ans, d[i]);
}
}
if(ans == (MAXN + 1)) {
ans = -1;
}
fprintf(fout, "%d", ans);
}
inline void dfs(int nod) {
d[nod] = MAXN + 1;
if(v[nod] == k) {
d[nod] = 1;
}
for(int i = 0; i < neighbors[nod].size(); i++) {
int vec = neighbors[nod][i];
if(!vis[vec]) {
vis[vec] = 1;
dfs(vec);
}
d[nod] = std::min(d[nod], vec - nod + d[vec]);
}
}