Cod sursa(job #201134)

Utilizator MciprianMMciprianM MciprianM Data 29 iulie 2008 09:51:38
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
int cauta(int el, int sir[], int poz, int l){
  while(sir[poz]!=el&&poz<l)  poz++;
  if(poz==l)
    return -1;
  return poz-1;
}
int lung(int poz, int a[],int n, int s[], int c){
  int i, poz2=poz;
  for(i=1;i<c;i++){
    poz2=cauta(s[i],a,poz2,n);
    if(poz2==-1)
      return -1;
  }
  return (poz2-poz+1);
}
int main(){
  int a[5000], b[5000], n, i,ant, s[5000], c=0, min=10000,pozant=1,poz,l;
  ifstream f("secv.in");
  f>>n;
  for(i=0;i<n;i++)
    f>>a[i];
  f.close();
  memcpy(b,a, sizeof(a));
  sort(b, b+n);
  ant=b[0];
  s[c++]=ant;
  for(i=0;i<n;i++){
    if(ant!=b[i])
      s[c++]=b[i];
    ant=b[i];
  }
  for(i=0, ant=b[i], poz=0; b[i]==ant;i++){
    poz=cauta(ant,a,poz, n);
    if(poz==-1&&i==0){
      min=-1;
      ofstream g("secv.out");
      g<<min<<'\n';
      g.close();
      return 0;
    }
    else if(poz==-1) {
      if(min==10000)
	min=-1;
      ofstream g("secv.out");
      g<<min<<'\n';
      g.close();
      return 0;
    }
    else {
    l=lung(poz, a, n, s,c);
    if(l==-1)
	pozant=-1;
    if(l<min&&pozant==1)
      min=l;
    }
  }
  if(min==10000)
    min=-1;
  ofstream g("secv.out");
  g<<min<<'\n';
  g.close();
  return 0;
}