Cod sursa(job #1316715)

Utilizator LegionHagiu Stefan Legion Data 14 ianuarie 2015 01:19:06
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int initial[5010],unice[5010],d=2,inceput[5010],celmaimare[5010],n,minim=9999999;
struct bun
{
    int termina[5010];
    int marime;
    int locatie;
    void initializare()
    {
        int i;
        for (i=1;i<=d;i++)
        {
            termina[i]=0;
        }
    }
};
vector <bun> incercari;
bun lavrajeala;
void quicksort(int inceput,int sfarsit)
{
    int i=inceput;
    int j=sfarsit;
    int medie=initial[(i+j)/2];
    while (i<=j)
    {
        while (initial[i]<medie){i++;}
        while (initial[j]>medie){j--;}
        if (i<=j)
        {
            swap (initial[i],initial[j]);
            i++;
            j--;
        }
    }
    if (i<sfarsit){quicksort(i,sfarsit);}
    if (j>inceput){quicksort(inceput,j);}
}
int cb(int cautat)
{
    int i=1;
    int j=d;
    int mij=(i+j)/2;
    while (unice[mij]!=cautat)
    {
        if (unice[mij]>cautat){j=mij-1;mij=(i+j)/2;}
        if (unice[mij]<cautat){i=mij+1;mij=(i+j)/2;}
    }
    return mij;
}
void rez(int initial,int valoare,int alcatelea)
{
    if (valoare==1)
    {
        if (initial-alcatelea+1<minim)
        {
            minim=initial-alcatelea+1;
        }
    }
    if (celmaimare[valoare-1]<alcatelea)
    {
        rez(initial,valoare-1,celmaimare[valoare-1]);
    }
    else
    {
        int i;
        for (i=alcatelea;i>=1;i--)
        {
           if (cb(inceput[i])==valoare-1)
               {
                   celmaimare[valoare-1]=i;
                   rez(initial,valoare-1,i);
                   break;
               }
        }
    }

}
int main()
{
    ifstream in("secv.in");
    ofstream out("secv.out");
    int i,lungime=0,incluse=0;
    in>>n;
    for (i=1;i<=n;i++)
    {
        in>>initial[i];
        inceput[i]=initial[i];
    }
    quicksort(1,n);
    unice[1]=initial[1];
    for (i=2;i<=n;i++)
    {
        if (initial[i]!=initial[i-1])
        {
            unice[d]=initial[i];
            d++;
        }
    }
    d--;
    for (i=1;i<=d;i++)
    {
        celmaimare[i]=999999;
    }
    for (i=n;i>=1;i--)
    {
        if (inceput[i]==unice[d])
        rez(i,d,i);
    }if (minim>10000){minim=-1;}
    out<<minim;
}