【题目描述】
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;
}