[NOIP2002 提高组] 均分纸牌

题目描述

有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>
#
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值