博客
关于我
均分纸牌
阅读量:196 次
发布时间:2019-02-28

本文共 1323 字,大约阅读时间需要 4 分钟。

题目描述

  有 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 )

  A1 A2 … An ( N 堆纸牌,每堆纸牌初始数, l≤ Ai < 104

输出数据

  所有堆均达到相等时的最少移动次数。

样例输入49 8 17 6
样例输出3
程序分析
解题思路

  我们用贪心算法,按照从左到右的顺序移动纸牌。如第I堆的纸牌数不等于平均值,则移动一次(即s加1),分两种情况移动:

  1. 若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆,第I堆上的纸牌数等于平均值
  2. 若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆,也就是说将a[i]-v(负数)张从第I堆移动到第I+1堆,第I堆上的纸牌数等于平均值
       为了设计的方便,我们把这两种情况统一看作是将a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+(a[i]-v)
对于a[i]-v为负数的分析

  在从第I+1堆取出纸牌补充第I堆的过程中可能回出现第I+1堆的纸牌小于零的情况。

  如n=3,三堆指派数为1 2 27 ,这时v=10,为了使第一堆为10,要从第二堆移9张到第一堆,而第二堆只有2张可以移,这是不是意味着刚才使用贪心法是错误的呢?
  我们继续按规则分析移牌过程,从第二堆移出9张到第一堆后,第一堆有10张,第二堆剩下-7张,在从第三堆移动17张到第二堆,刚好三堆纸牌都是10,最后结果是对的,我们在移动过程中,只是改变了移动的顺序,而移动次数不便,因此此题使用贪心法可行的。

代码
N = int(input())cards = list(map(int, input().split(" ")))count = 0average = sum(cards) / Nfor i in range(N - 1):    if cards[i] - average != 0:        cards[i + 1] = cards[i + 1] + (cards[i] - average)        cards[i] = average        count = count + 1print(count)

  1. https://blog.csdn.net/u011035622/article/details/43650869

你可能感兴趣的文章
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>