Cod sursa(job #882885)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 19 februarie 2013 15:41:34
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>

long n, nr, min;
long s[5061];

int main() {
     long i, j, k;
     freopen("secv.in", "r", stdin);
     freopen("secv.out", "w", stdout);
     scanf("%ld", &n);
     if(n == 1) {
          printf("1\n");
          return 0;
     }
     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;
}