比赛 |
20091026 |
评测结果 |
WAWWWWWWWW |
题目名称 |
货物搬运 |
最终得分 |
10 |
用户昵称 |
Truth.Cirno |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-10-26 20:38:41 |
显示代码纯文本
#include <cstdio>
using namespace std;
int a[10001];
bool used[10001];
int absint(int a)
{
if (a>=0)
return(a);
else
return(-a);
}
int minint(int a,int b)
{
if (a>b)
return(b);
else
return(a);
}
int main(void)
{
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
int i,j,dis,n,ave=0,rest,cost=0,maxnum,maxpos,temp,flag;
scanf("%d",&n);
rest=n;
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ave+=a[i];
}
ave/=n;
while (rest)
{
maxnum=0;
for (i=1;i<=n;i++)
{
if (a[i]>=maxnum)
{
maxnum=a[i];
maxpos=i;
}
// if (a[i]<=minnum)
// {
// minnum=a[i];
// minpos=i;
// }
}
/*
tempmin=ave-minnum;
tempmax=maxnum-ave;
if (tempmin>tempmax)
{
a[maxpos]-=tempmax;
a[minpos]+=tempmax;
cost+=tempmax*minint(absint(maxpos-minpos),minint(n-maxpos+minpos,n-minpos+maxpos));
}
else
{
a[maxpos]-=tempmin;
a[minpos]+=tempmin;
cost+=tempmin*minint(absint(maxpos-minpos),minint(n-maxpos+minpos,n-minpos+maxpos));
}
if (tempmin==tempmax)
rest-=2;
else
rest-=1;
*/
temp=maxnum-ave;
rest--;
used[maxpos]=true;
for (j=maxpos+1,i=maxpos-1,dis=1;temp&&i!=j&&dis*2+1<=n;i--,j++,dis++)
{
if (i==0)
i=n;
if (j==n+1)
j=1;
while (temp)
{
flag=0;
if (a[i]<ave&&temp)
{
a[maxpos]--;
a[i]++;
temp--;
cost+=dis;
flag++;
}
if (a[j]<ave&&temp)
{
a[maxpos]--;
a[j]++;
temp--;
cost+=dis;
flag++;
}
if (flag==0)
break;
}
if (ave==a[i]&&!used[i])
{
rest--;
used[i]=true;
}
if (ave==a[j]&&!used[j])
{
rest--;
used[j]=true;
}
}
}
printf("%d\n",cost);
fclose(stdin);
fclose(stdout);
return(0);
}