【题解】平衡

【题目描述】

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值