题目描述
有N堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为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)。
输入格式
共两行
第一行:N,表示N堆纸牌(1≤N≤100)
第二行:N个数,表示每堆纸牌的张数(保证N堆纸牌的总和是N的倍数,每个数用空格分隔)(每堆纸牌在1~10000张之间)
输出格式
一行
均分纸牌的最少移动次数
样例
样例输入
4
9 8 17 6
样例输出
3
题解
这是一个经典的贪心问题。
题目给的每一堆纸牌都有3种情况:
少于平均数、等于平均数或多于平均数,且每一堆都只能将纸牌给相邻的2堆(第一堆和最后一堆除外)我们可以选择从左向右依次遍历,将每一堆多的纸牌移到右堆,从与自己相邻的右边的纸牌堆中拿出自己所需的纸牌数(不需要管差多少,右边的纸堆够不够,移就是了,因为一定能找到一种方法来补全这一堆纸牌少的纸牌数),这样就可以保证左边的所有纸牌堆都等于平均数。
代码如下(仅供参考):
#include<cstdio>
#