【题目描述】
P 同学总共有 k 根火柴,分别放在摆成一列的 n 个火柴盒内,保证 k 是 n 的
倍数。P 同学想要每个火柴盒都有相同数目的火柴,每次他可以从一个火柴盒中
拿一根火柴放到相邻的火柴盒中。他想知道他最少要移动多少次。
【输入格式】
第一行一个整数 n,表示火柴盒数。 第二行 n 个整数𝑎1,𝑎2,…,𝑎𝑛, 表示第 i 个火柴盒内有𝑎𝑖根火柴。
【输出格式】
一行一个整数,表示最少要移动多少次。
【样例一输入】
6
1 6 2 5 3 7
【样例一输出】
12
【数据规模】
30%数据,1 ≤ n ≤ 100,0 ≤ 𝑎𝑖 ≤ 100 100%数据,1 ≤ n ≤ 50000,0 ≤ 𝑎𝑖 ≤ 109
思路
先求出平均数,再for循环看看每盒火柴还差多少才能到达平均数,向右边的借(如果刚刚好就不用操作)
code
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
long long n,a[N],sum,average,anss;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
average=sum/n; //平均数
for (int i=1;i<=n;i++)
{
if (a[i]<average)
{
anss+=(average-a[i]);
a[i+1]-=(average-a[i]);
}
if (a[i]>average)
{
anss+=(a[i]-average);
a[i+1]+=(a[i]-average);
}
}
cout<<anss<<endl;
return 0;
}