码迷,mamicode.com
首页 > 其他好文 > 详细

均分火柴

时间:2018-12-10 18:22:46      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:temp   ret   题目   遍历   生产   include   情况   code   遍历数组   

题目

火柴厂生产火柴以后,要装盒。现有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\n", count);
    return 0;
}

均分火柴

标签:temp   ret   题目   遍历   生产   include   情况   code   遍历数组   

原文地址:https://www.cnblogs.com/JingWenxing/p/10082848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!