Cod sursa(job #199360)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 18 iulie 2008 09:03:31
Problema Barman Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>
long n,i,a[1201],b[601],m,j,c[601],*d,e[601],f[601],
g[601][601],h[601][601],sol=2000000000;
void citire();
void sortare();
void normalizare();
void solve();
void afisare();
int main()
{
	citire();
	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++)a[i+n]=a[i];
}
void sortare()
{
	n=0;
	for(i=1;i<=m;i++)
	 for(j=1;j<=c[i];j++)
	  b[++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 sc,nr,k,p[601],q[601],L,M,R,s1,s2;
  for(i=1;i<=n;i++)
  { d=&a[i-1];
    for(j=1;j<=m;j++){e[j]=0;f[j]=0;}
    for(j=1;j<=n;j++)
     { if(b[j]==d[j])continue;
       g[b[j]][++e[b[j]]]=j;
       h[d[j]][++f[d[j]]]=j;
     }
    sc=0;
    for(j=1;j<=m;j++)
    { nr=e[j];
      if(!nr)continue;
      for(k=1;k<=nr;k++)
	p[k]=g[j][k];
      if(h[j][nr]<p[1])
       { for(k=1;k<=nr;k++)q[k]=h[j][k];}
      else
      if(h[j][1]>p[nr])
       { for(k=1;k<=nr;k++)q[k]=h[j][k]-n;}
      else
       { L=1;R=nr;
	 while(R-L-1)
	 { M=(R+L)/2;
	   if(h[j][M]>p[nr])R=M;
	   else L=M;
	 }
	 nr=0;
	 for(k=R;k<=e[j];k++)
	  q[++nr]=h[j][k]-n;
	 for(k=1;k<=L;k++)
	  q[++nr]=h[j][k];
       }
      s1=20*nr;
      for(k=1;k<=nr;k++)
      { s1+=p[k];s1-=q[k];}
      s2=s1;
      for(k=1;k<=nr;k++)
      { s1+=q[k];s1-=p[nr-k+1];
	q[k]+=n;
	s1+=q[k];s1-=p[nr-k+1];
	s2=(s2<s1)?s2:s1;
      }
      sc+=s2;
    }
    sol=(sol<sc)?sol:sc;
  }
}
void afisare()
{
	freopen("barman.out","wt",stdout);
	printf("%ld\n",sol);
}