题目:
题目描述
P同学总共有k根火柴,分别放在摆成一列的n个火柴盒内,保证k是n的倍数。P同学想要每个火柴盒都有相同数目的火柴,每次他可以从一个火柴盒中拿一根火柴放到相邻的火柴盒中。他想知道他最少要移动多少次。
输入输出格式
输入格式:
第一行一个整数n,表示火柴盒数。 第二行n个整数a_1,a_2,…,a_n, 表示第i个火柴盒内有a_i根火柴。
输出格式:
一行一个整数,表示最少要移动多少次。
输入输出样例
输入样例#1:
6
1 6 2 5 3 7
输出样例#1:
12
说明
30%数据,1≤n≤100,0≤a_i≤100
100%数据,1≤n≤50000,0≤a_i≤10^9
思路:很明显,模个拟就好。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 50000
#define read(x) scanf("%lld",&x);
#define ll long long
ll n;
ll a[maxn+5];
int main() {
read(n);
for(ll i=1;i<=n;i++) read(a[i]);
ll s=0;
for(ll i=1;i<=n;i++) s+=a[i];
ll k=s/n,cnt=0;
for(ll i=1;i<=n;i++) {
if(a[i]>k) {
a[i+1]+=(a[i]-k);
cnt+=(a[i]-k);
a[i]=k;
} else if(a[i]<k) {
a[i+1]-=(k-a[i]);
cnt+=(k-a[i]);
a[i]=k;
}
}
printf("%lld",cnt);
return 0;
}