均分火柴

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;
}

以上是关于均分火柴的主要内容,如果未能解决你的问题,请参考以下文章

C/C++项目开发:《火柴人游戏》,500行源代码开发

LeetCode 374 火柴拼正方形[回溯] HERODING的LeetCode之路

关于经典题目火柴棒等式

火柴排队

Codevs 3286 火柴排队

用html怎么画一个第一行平均分两列,第二行平均分三列的表格代码