干草

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

题目描述

奶牛们又来捣乱了!

农夫约翰精心整理的 N 堆干草,每堆干草的高度相同。

但是,奶牛们趁着他不注意在干草堆之间移动了一些干草捆,使得各个干草堆的高度可能不再相同了。

给定所有干草堆的新高度,请帮助约翰确定,为了使所有干草堆恢复到原来的相同高度,至少要移动的最小干草捆数。

输入格式

第一行包含整数 N。

接下来 N 行,每行包含一个整数(范围 1,10000),表示每个干草堆的现有干草捆数量(也就是新高度)。

输出格式

输出需要移动的最小干草捆数。

数据范围

1≤N≤10000

输入样例:

4
2
10
7
1

输出样例:

7

样例解释

至少要移动 7 个干草捆(将 3 个干草捆从第 2 堆移动至第 1 堆,将 2 个干草捆从第 2 堆移动至第 4 堆,将 2 个干草捆从第 3 堆移动至第 4 堆)。

思路

解法一:

关于这道题的题号是OIer们的庆祝日1024的两倍…… 我们来看下题。设resres是平分后每堆干草的捆数,那么如果一堆干草的数量>res>res,肯定是不需要补干草的;如果一堆干草的数量<res<res,那么就需要补上res−cres−c(cc是这堆干草的数量)捆干草,这些干草的来源就是那些不需要补干草的堆。

解法二:

把大于平均的干草给小于平均的干草,就是看目前小于平均的干草垛一共缺多少才能到平均。

代码

解法一:

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; scanf("%d", &n);
    int res = 0, ans = 0, a[10010]; for (int i = 1; i <= n; i++) scanf("%d", &a[i]), res += a[i];
    res /= n; for (int i = 1; i <= n; i++) if (res > a[i]) ans += res - a[i];
    printf("%d\n", ans);
    return 0;
}
​

\