Cod sursa(job #199403)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 18 iulie 2008 16:57:01
Problema Barman Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<stdio.h>
long n,i,a[700],bb[1400],*b,m,j,c[700],sol=2000000000;
void citire();
void sortare();
void normalizare();
void solve();
void afisare();
int main()
{
	citire();
	for(i=1;i<=n;i++)
	{ b=&bb[i-1];
	  solve();
	}
	afisare();
	return 0;
}
void citire()
{
	freopen("barman.in","rt",stdin);
	scanf("%ld",&n);
	for(i=1;i<=n;i++)
	{ scanf("%ld",&a[i]);
	  a[i]-=2000000000;
	}
	normalizare();
	sortare();
	for(i=1;i<=n;i++)bb[i+n]=bb[i];
}
void sortare()
{
	n=0;
	for(i=1;i<=m;i++)
	 for(j=1;j<=c[i];j++)
	  bb[++n]=i;
}
void normalizare()
{
	long L=1,R=n,min;
	while(L<=R)
	{  min=1;
	   for(i=L;i<=R;i++)
	    min=(a[i]<min)?a[i]:min;
	   if(min==1)return;
	   m++;
	   while(a[L]==min){a[L]=m;L++;c[m]++;}
	   while(a[R]==min){a[R]=m;R--;c[m]++;}
	   for(i=L;i<=R;i++)
	    if(a[i]==min){a[i]=m;c[m]++;}
	}
}
void solve()
{ long LA,LB,RA,RB,sc,s1,s2,va[700],vb[700],val,
  qa[1400],qb[1400],*pa,*pb,nr,*paux;
  LA=1;LB=1;
  RA=n;RB=n;
  sc=0;
  for(j=1;j<=n;j++)
   { va[j]=0;vb[j]=0;
     if(a[j]==b[j]){va[j]=1;vb[j]=1;}
   }
  while(LA<=RA)
  { if(va[LA]){LA++;continue;}
    if(va[RA]){RA--;continue;}
    if(vb[LB]){LB++;continue;}
    if(vb[RB]){RB--;continue;}
    val=a[LA];
    nr=0;pa=&qa[650];pb=&qb[650];
    for(j=LA;j<=RA;j++)
     { if(!va[j])
       if(a[j]==val){pa[++nr]=j;va[j]=1;}
     }
    nr=0;
    for(j=LB;j<=RB;j++)
     { if(!vb[j])
       if(b[j]==val){pb[++nr]=j;vb[j]=1;}
     }
    if(pa[1]<pb[1]&&pb[nr]<pa[nr])
     while(pa[nr]>pb[nr]){pa[0]=pa[nr]-n;pa--;}
    else
    if(pb[1]<pa[1]&&pa[nr]<pb[nr])
    { paux=pa;pa=pb;pb=paux;
      while(pa[nr]>pb[nr]){pa[0]=pa[nr]-n;pa--;}
    }
    else
    if(pa[1]>pb[nr])
    {paux=pa;pa=pb;pb=paux;}
    s1=20*nr;
    for(j=1;j<=nr;j++)
    { s1+=pb[j];s1-=pa[j];}
    s2=s1;
    for(j=1;j<=nr;j++)
    { s1+=pa[j];s1-=pb[nr-j+1];
      pa[j]+=n;
      s1+=pa[j];s1-=pb[nr-j+1];
      s2=(s2<s1)?s2:s1;
    }
    sc+=s2;
  }
  sol=(sc<sol)?sc:sol;
}
void afisare()
{
	freopen("barman.out","wt",stdout);
	printf("%ld\n",sol);
}