博客
关于我
均分纸牌
阅读量: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 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySQL 高性能优化规范建议
查看>>