均分火柴

题目

火柴厂生产火柴以后,要装盒。现有N个火柴盒要装填火柴,编号分别是 1,2,…,N。开始工人在每堆上都随意放了若干根火柴。但是一批次装填的火柴盒要求装填的根数一致,而且都必然能装进火柴盒。所以后续要求在任意盒里取若干根火柴左右移动。 移动火柴的规则为:在编号为1的盒上取的火柴,只能移动到编号为2的盒上;在编号为N的盒上取的火柴,只能移动到编号为N-1的盒上;其他盒的火柴,可以移动到相邻左边或右边的盒上。现在要求找出一种移动方法,用最少的移动次数使每盒上火柴数都一样多。 例如N=4,4盒火柴数分别为: ①9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取4根火柴放到④(9 8 13 10)->从③取3根火柴放到 ②(9 11 10 10)-> 从②取1根火柴放到①(10 10 10 10)。 答案要求在一秒钟之内,128MB内存的情况下得出。

输入格式:

输入文件中包括两行数据。 第一行为N个火柴盒的数值(1<=N<=100)。 第二行为N个火柴盒中每盒火柴初始数A1,A2,…,An(l<=Ai<=10000)。

输出格式:

输出文件中仅一行,即所有盒里火柴数均达到相等时的最少移动次数。

输入样例:

4
9 8 17 6

输出样例:

3

思路:

通过对输入样例的分析,得知我需要的就是将每堆火柴的数量增加或减少到总体的平均值。那么只需计算的得出平均值,然后遍历数组,从0号开始,若少于平均值则从下一堆中拿取,若多于平均值则放入下一堆,以此类推,一直到最后。

代码:

#include <cstdio>
int main()
{
	int num, sum = 0, avreage = 0, count = 0;
	int a[101] = { 0 };
	scanf("%d", &num);

	for (int i = 0; i < num; i++)
	{
		scanf("%d", &a[i]);
		sum += a[i];
	}

	avreage = sum / num;

	for (int i = 0; i < num; i++)
	{
		int temp = 0;
		if (a[i] != avreage)
		{
			temp = a[i] - avreage;
			a[i + 1] = a[i + 1] + temp;
			count++;
		}
	}
	printf("%d
", count);
	return 0;
}
原文地址:https://www.cnblogs.com/JingWenxing/p/10082848.html