比赛 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);
}