Cod sursa(job #2524359)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 15 ianuarie 2020 16:14:33
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include<fstream>
#include<algorithm>
#define N 5005
using namespace std;
ifstream fin("secv.in");
ofstream fout("secv.out");

int n;
int a[N];

int k;
int dist[N];//elem distincte din vector ordonate crescator

int mini=2000000000;


void read()
{
    int i,j;
    fin>>n;
    for(i=1;i<=n;++i)
    {
        fin>>a[i];
        dist[i]=a[i];
    }
}

int pivotare(int s,int d)
{
    int i=s,j=d;
    int pasi=0,pasj=1;
    int p=s+rand()%(d-s+1);
    int aux=dist[s];dist[s]=dist[p];dist[p]=aux;
    while(i<j)
    {
        if(dist[i]>dist[j])
        {
            swap(dist[i],dist[j]);
            swap(pasi,pasj);
        }
        i+=pasi;
        j-=pasj;
    }
    return i;
}

void qs(int s,int d)
{
    if(s<d)
    {
        int p=pivotare(s,d);
        qs(s,p-1);
        qs(p+1,d);

    }
}

void solve()
{
    int i,x,j;
    bool gasit=false;
    qs(1,n);//sortam dist

    ///pastram in dist doar elem distincte
    k=1;
    for(i=2;i<=n;++i)
        if(dist[i]!=dist[i-1])
            dist[++k]=dist[i];
    //for(i=1;i<=k;++i)cout<<dist[i]<<" ";
    for(i=1;i<=n;++i)//de unde poate incepe secv ceruta
    {
        x=1;//elem pe care il caut in dist
        for(j=i;j<=n;++j)
            if(dist[x]==a[j])
        {
            x++;
            if(x==k+1)//le am gasit pe toate
            {
                gasit=true;
                mini=min(mini,j-i+1);
            }

        }
    }
    if(gasit==false)fout<<-1;
    else fout<<mini;
}

int main()
{
    int i;
    read();
    solve();

    return 0;
}