Pagini recente » Cod sursa (job #2441117) | Cod sursa (job #2870750) | Cod sursa (job #175506) | Cod sursa (job #1316603) | Cod sursa (job #1861881)
#include <cstdio>
#include <algorithm>
using namespace std;
struct pereche
{
int valoare,indice,urmator;
}v[5005];
int lmin=5001,numere[5001],cnt_max,n;
bool cmp(const pereche &a,const pereche &b)
{
if (a.valoare==b.valoare)
return a.indice<b.indice;
return a.valoare<b.valoare;
}
void functie(int indice1,int nr,int lung)
{
int in=1,sf=n,mij,gasit=0;
if (v[indice1].urmator!=0)
gasit=v[indice1].urmator;
else
while (in<=sf)
{
mij=(in+sf)/2;
if (v[mij].valoare<numere[nr])
in=mij+1;
if (v[mij].valoare>numere[nr])
sf=mij-1;
if (v[mij].valoare==numere[nr])
{
if (v[mij].indice>v[indice1].indice)
gasit=mij, sf=mij-1;
if (v[mij].indice<v[indice1].indice)
in=mij+1;
}
}
if (gasit!=0)
{
v[indice1].urmator=gasit;
int lungime=lung+v[gasit].indice-v[indice1].indice;
if (nr==cnt_max)
{
if (lungime<lmin)
lmin=lungime;
}
else functie(gasit,nr+1,lungime);
}
}
int main()
{
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
scanf("%d ",&n);
for (int i=1;i<=n;++i)
scanf("%d ",&v[i].valoare), v[i].indice=i;
sort(v+1,v+n+1,cmp);
numere[0]=-1;
for (int i=1;i<=n;++i)
if (v[i].valoare!=v[i-1].valoare)
cnt_max++, numere[cnt_max]=v[i].valoare;
for (int i=1;v[i].valoare==numere[1];++i)
functie(i,2,1);
printf("%d",lmin);
/*for (int i=1;i<=n;i++)
printf("%d ",v[i].valoare);
printf("\n");
for (int i=1;i<=n;i++)
printf("%d ",v[i].indice);
printf("\n");*/
}