Pagini recente » Cod sursa (job #66480) | Cod sursa (job #2084538) | Cod sursa (job #199535) | Cod sursa (job #38993) | Cod sursa (job #199360)
Cod sursa(job #199360)
#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);
}