【10.27 校内普及(五)】 最少移动 题解
题目
解题思路
总和求平均
从左往右移
减或加成平均值
补的从下一个拿
多的给下一个
如果最后一个数能变成平均值
输出次数
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long t,n,ans,sum,a[100100];
int main()
{
scanf("%lld",&t);
for (int i=1;i<=t;i++)
{
scanf("%lld",&n);
ans=sum=0;
for (int j=1;j<=n;j++)
{
scanf("%lld",&a[j]);
sum+=a[j];
}
if (sum%n) //不能平均,说明不能变成同一个数
{
printf("-1\n");
continue;
}
else {
int x=sum/n;
for (int j=1;j<n;j++)
if (a[j]!=x)
{
ans+=abs(x-a[j]);
if (a[j]>x)
a[j+1]+=a[j]-x;
else a[j+1]-=x-a[j];
}
if (a[n]==x)
printf("%lld\n",ans);
else printf("-1\n");
}
}
return 0;
}