#include using namespace std; const int N = 10010; int a[N]; int sum, avg, total; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; } if (sum % n) { cout << -1 << endl; exit(0); } avg = sum / n; // 平均数 /* 算法思路 1、求出平均数avg 2、枚举每个数字: (1) 如果当前数字比avg大,不断向后面找出比avg小的数,将自己多出的部分传递给这个数=min(超过avg的量,少于avg的量) 如果一下子没用了,就继续向后做同样的操作 (2) 如果当前数字比avg小,不断向后面找出比avg大的数,将自己少出的部分传递给这个数=min(超过avg的量,少于avg的量) 如果一下子没用了,就继续向后做同样的操作 举栗子思考: 3 10 1 1 3 5 1 6 3 1 5 6 */ for (int i = 1; i <= n; i++) { int d = a[i] - avg; // 差值,注意:这个差值可能是正的,也可能是负的 total += abs(d); for (int j = i + 1; j <= n; j++) { // 枚举i的所有后位的小朋友,如果当前i位上的小朋友需要糖果或者多出来糖果时,应该把 // 多出来的糖果分给哪些小朋友,或者,少出来的糖果需要从哪些小朋友那里要过来 // 向后找比avg小的 if (d > 0 && a[j] < avg) { int x = min(d, avg - a[j]); a[i] -= x; a[j] += x; d -= x; } // 向后找比avg大的 if (d < 0 && a[j] > avg) { int x = min(abs(d), a[j] - avg); a[i] += x; a[j] -= x; d += x; } if (d == 0) break; } } cout << total << endl; return 0; }