Pagini recente » Cod sursa (job #2129237) | Cod sursa (job #2803914) | Cod sursa (job #2173646) | Cod sursa (job #293813) | Cod sursa (job #474005)
Cod sursa(job #474005)
#include <stdio.h>
#include <stdlib.h>
#include <set>
#include <vector>
#include <algorithm>
#define MAXN 5000
int n;
FILE *f;
int a[MAXN];
int best = 2 * MAXN;
int max;
struct secv {
int start;
};
#define printf(...)
int main() {
f = fopen("secv.in", "rt");
fscanf(f, "%d", &n);
for (int i = 0; i < n; ++i) fscanf(f, "%d", a + i);
fclose(f);
{
std::set<int> all;
for (int i = 0; i < n; ++i) all.insert(a[i]);
std::vector<int> v(all.begin(), all.end());
std::sort(v.begin(), v.end());
max = v.size();
for (int i = 0; i < n; ++i)
a[i] = std::lower_bound(v.begin(), v.end(), a[i]) - v.begin();
}
secv** s = new secv*[max + 1];
for (int i = 0; i <= max; ++i) s[i] = NULL;
for (int i = 0; i < n; ++i) {
int x = a[i];
if (!x) {
if (s[0]) delete s[0];
s[0] = new secv();
s[0]->start = i;
if (max == 1)
best = 1;
printf("Start de pe %d il vrea pe 1\n", i);
continue;
}
if (s[x - 1]) {
if (s[x]) delete s[x];
s[x] = s[x - 1];
s[x - 1] = NULL;
printf("Start de pe %d il vrea pe %d\n", s[x]->start, x + 1);
if (x + 1 == max) {
printf("Gasti solutie de pe %d -> %d de lungime %d\n",
s[x]->start, i, i - s[x]->start + 1);
if (i - s[x]->start + 1 < best)
best = i - s[x]->start + 1;
}
}
}
if (best == 2 * MAXN) best = -1;
f = fopen("secv.out", "wt");
fprintf(f, "%d\n", best);
fclose(f);
}