Pagini recente » Clasamentul arhivei Infoarena Monthly | Cod sursa (job #1391000) | Cod sursa (job #2678229) | Cod sursa (job #998134) | Cod sursa (job #882870)
Cod sursa(job #882870)
#include <stdio.h>
long n, nr, min;
long s[5001];
int main() {
long i, j, k;
freopen("secv.in", "r", stdin);
freopen("secv.out", "w", stdout);
scanf("%ld", &n);
for(i = 1; i <= n; i++)
scanf("%ld", &s[i]);
nr = 0;
while(true) {
for(i = 1; i <= n; i++)
if(s[i] >= nr)
break;
if(i == n + 1)
break;
min = s[i];
for(i++; i <= n; i++)
if(s[i] < min && s[i] >= nr)
min = s[i];
for(i = 1; i <= n; i++)
if(s[i] == min)
s[i] = nr;
nr++;
}
i = 1;
min = n + 1;
while(true) {
while(s[i] != 0 && i <= n) // cat timp nu am un prim element
i++; // incrementez
if(i == n + 1) //daca nu am mai gasit,
break; // ies
j = i + 1; //incep de la caracterul de dupa
for(k = 1; k < nr; k++) { // si caut in ordine toate elementele necesare
while(s[j] != k && j <= n) // daca n-am gasit inca si n-am iesit din vector
j++; // incrementez
if(j > n) // daca am iesit din vector
break; // ies din for
}
if(k != nr) // daca nu am gasit toate elementele
break; // ies
if(j - i + 1 < min) // daca am o solutie mai buna
min = j - i + 1; // minul este pus pe aceasta
i++; // sar peste elementul prim curent
}
if(min < n + 1)
printf("%ld\n", min);
else printf("-1\n");
return 0;
}