• 均分火柴


    题目

    火柴厂生产火柴以后,要装盒。现有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;
    }
  • 相关阅读:
    Spring初次整体了解及一篇SpringBoot的稿子。。。
    JAVA日志框架log4j和slf4j
    初学SpringBoot之三
    初学SpringBoot之二
    初学SpringBoot之一
    (转)SWITCH_ROOT
    (转)initrd和initramfs的区别
    (转)三星HDMI驱动框架解析
    (转)linux内存分析
    (转)linux中挂载IMG文件
  • 原文地址:https://www.cnblogs.com/JingWenxing/p/10082848.html
Copyright © 2020-2023  润新知