Cod sursa(job #1815795)

Utilizator TincaMateiTinca Matei TincaMatei Data 25 noiembrie 2016 19:35:58
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 5000;

int  v[MAX_N], din[MAX_N], first[MAX_N], v2[MAX_N];

int main() {
  int n, dist, max, size;
  FILE *fin = fopen("secv.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 0; i < n; ++i) {
    fscanf(fin, "%d", &v[i]);
    v2[i] = v[i];
  }
  fclose(fin);

  std::sort(v2, v2 + n);
  dist = 1;
  for(int i = 1; i < n; ++i) {
    if(v2[i] != v2[i - 1])
      dist++;
  }

  for(int i = 0; i < n; ++i) {
    first[i] = i;
    din[i] = 1;
    for(int j = 0; j < i; ++j)
      if(v[i] > v[j] && din[j] + 1 > din[i]) {
        din[i] = din[j] + 1;
        first[i] = first[j];
      } else if(v[i] > v[j] && din[j] + 1 == din[i] && first[j] > first[i])
        first[i] = first[j];
  }

  FILE *fout = fopen("secv.out", "w");
  max = size = -1;
  for(int i = 0; i < n; ++i)
    if(din[i] > max) {
      max = din[i];
      size = i - first[i] + 1;
    } else if(din[i] == max && i - first[i] + 1 < size)
      size = i - first[i] + 1;

  if(max == dist)
    fprintf(fout, "%d", size);
  else
    fprintf(fout, "-1");
  fclose(fout);
  return 0;
}