【题解】平衡

mac2026-04-10  3

【题目描述】

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; }
最新回复(0)