均分火柴
Posted jingwenxing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了均分火柴相关的知识,希望对你有一定的参考价值。
题目
火柴厂生产火柴以后,要装盒。现有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;
}
以上是关于均分火柴的主要内容,如果未能解决你的问题,请参考以下文章