Cod sursa(job #199565)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 iulie 2008 14:20:13
Problema Barman Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include<stdio.h>
long n,i,m,a[700],o[700],b[700],sol,c[700],
a1[700][700],b1[700][700];
void citire();
void sortare();
void hd(long ic,long nc);
void sh(long i1,long i2);
void normalizare();
void alocare();
void rezolvare();
void afisare();
int main()
{
	citire();
	sortare();
	normalizare();
	if(m==n)for(;;);
	alocare();
	rezolvare();
	afisare();
	return 0;
}
void citire()
{
	freopen("barman.in","rt",stdin);
	scanf("%ld",&n);
	for(i=1;i<=n;i++){ scanf("%ld",&a[i]);o[i]=i;b[i]=a[i];}
}
void sortare()
{     for(i=n/2;i>=1;i--)hd(i,n);
      for(i=n;i>=1;i--){sh(1,i);hd(1,i-1);}
}
void hd(long ic,long nc)
{	long is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc)return;
	if(is<nc) if(a[is1]>a[is]||(a[is]==a[is1]&&o[is]<o[is1]))is=is1;
	if(a[is]>a[ic]||(a[is]==a[ic]&&o[is]>o[ic])){sh(is,ic);hd(is,nc);}
}
void sh(long i1,long i2)
{	long aux;
	aux=a[i1];a[i1]=a[i2];a[i2]=aux;
	aux=o[i1];o[i1]=o[i2];o[i2]=aux;
}
void normalizare()
{	long val=a[1],nval=1;
	for(i=1;i<=n;i++)
	{ if(a[i]!=val){val=a[i];nval++;}
	  a[i]=nval;b[o[i]]=nval;c[nval]++;
	}
	m=nval;
	if(m==1)for(;;);
	for(i=1;i<=n;i++)a[i+n]=a[i];
}
void afisare()
{
	freopen("barman.out","wt",stdout);
	printf("%ld\n",sol);
}
void alocare()
{
	for(i=1;i<=m;i++)c[i]=0;
	for(i=1;i<=n;i++) a1[a[i]][++c[a[i]]]=i;
	for(i=1;i<=m;i++) c[i]=0;
	for(i=1;i<=n;i++) b1[b[i]][++c[b[i]]]=i;
}
void rezolvare()
{       long u,j,k,ia,ib,na,nb,aa[700],bb[700],sc,l;
	sol=1000000000;
	for(i=0;i<n;i++)
	{ u=a[n-i];
	  sc=0;
	  for(j=1;j<u;j++)
	   for(k=1;k<=c[j];k++)
	    a1[j][k]++;
	  for(j=u+1;j<=m;j++)
	   for(k=1;k<=c[j];k++)
	    a1[j][k]++;
	  for(k=2;k<=c[u];k++)
	   a1[u][k]=a1[u][k-1]+1;
	  a1[u][1]=1;
	  for(j=1;j<=m;j++)
	  { ia=1;ib=1;na=0;nb=0;
	    while(ia<=c[j]&&ib<=c[j])
	    { if(a1[j][ia]<b1[j][ib])
	      { aa[++na]=a1[j][ia];ia++;continue;}
	      if(b1[j][ib]<a1[j][ia])
	      { bb[++nb]=b1[j][ib];ib++;continue;}
	      ia++;ib++;
	    }
	    while(ia<=c[j]){aa[++na]=a1[j][ia];ia++;}
	    while(ib<=c[j]){bb[++nb]=b1[j][ib];ib++;}
	    if(!na)continue;
	    sc+=20*na;
	    if(aa[1]>bb[na])
	    { for(k=1;k<=na;k++)sc+=aa[k];
	      for(k=1;k<=na;k++)sc-=bb[k];
	      continue;
	    }
	    if(bb[1]>aa[na])
	    { for(k=1;k<=na;k++)sc+=bb[k];
	      for(k=1;k<=na;k++)sc-=aa[k];
	      continue;
	    }
	    if(bb[1]<aa[1])
	    { for(k=1;k<=na;k++){if(bb[k]>aa[k])break;sc+=aa[k];}
	      for(l=1;l<k;l++)sc-=bb[l];
	      for(l=k;l<=na;l++)sc+=bb[l];
	      for(l=k;l<=na;l++)sc-=aa[l];
	      continue;
	    }
	    for(k=1;k<=na;k++){if(bb[k]<aa[k])break;sc-=aa[k];}
	      for(l=1;l<k;l++)sc+=bb[l];
	      for(l=k;l<=na;l++)sc-=bb[l];
	      for(l=k;l<=na;l++)sc+=aa[l];
	      continue;
	  }
	  sol=(sol<sc)?sol:sc;
	}
}