关闭

[NOIP2002]均分纸牌题解

标签: C++编程贪心算法
1184人阅读 评论(0) 收藏 举报
分类:
题目描述
  有 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 <=10000)
输出格式
所有堆均达到相等时的最少移动次数。
样例输入 :
4
9 8 17 6
样例输出 :
3

题目分析:
要使每一堆的纸牌数目均相同,那么就要将多的移动到少的上面。那么怎么移动才能使步骤最少呢?这个地方就用到了贪心的思路,从最左端开始进行移动,如果第i堆的数目大于平均数,那么移动数加1,将多出来的移动到下一堆。如果第i堆数目小于平均数,那么移动数加1,用下一堆补充缺少的数目。下一堆可以为负数,这是这题的关键。本题中我们只是改变了移动的次序,而移动的总步数不会发生改变。贪心算法就是用最简单的方式让每一堆去达到它应该达到的值,不要去考虑其他因素,这就是本题的解法,也是贪心算法的精髓!就像在看这题讨论的时候的一句话,贪心要大胆!

AC代码:
#include<iostream>
using namespace std;


int N;
int data[101];
int total=0;
int ave;
int cnt=0;


void div()
{
for(int i=1;i<=N;++i)
{
if(data[i]<ave)
{
int need=ave-data[i]; //计算需求量
cnt++;
data[i+1]=data[i+1]-need; //从下一堆获取需求量
}
if(data[i]>ave)
{
int rich=data[i]-ave; //计算剩余量
cnt++;
data[i+1]=data[i+1]+rich; //将剩余量给到下一堆 
}  
}



int main()
{
cin>>N;
for(int i=1;i<=N;++i)
{
cin>>data[i];
total+=data[i];
}
ave=total/N; //均值
div();
cout<<cnt<<endl; 
return 0;

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

均分纸牌

Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1 堆上取的纸牌...
  • M___er
  • M___er
  • 2016-04-03 14:10
  • 452

codevs均分纸牌 贪心算法

题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1...
  • glaugagefer
  • glaugagefer
  • 2015-04-21 00:50
  • 673

贪心算法-均分纸牌-JAVA

[均分纸牌]有N堆纸牌,编号分别为1,2,…,n。每堆上有若干张,但纸牌总数必为n的倍数.可以在任一堆上取若干张纸牌,然后移动。移牌的规则为:在编号为1上取的纸牌,只能移到编号为2的堆上;在编号为n的...
  • u011035622
  • u011035622
  • 2015-02-08 23:54
  • 1405

hdu 2209 翻纸牌游戏 模拟||bfs

C - 翻纸牌游戏 Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub...
  • HowardEmily
  • HowardEmily
  • 2016-11-03 16:27
  • 1075

XYNUOJ 1249 均分纸牌(playcard)—贪心算法

欢迎访问XYNUOJ 1249: 均分纸牌(playcard) 时间限制: 1 Sec  内存限制: 128 MB 提交: 11  解决: 7 [提交][状态][讨论版][Edit] ...
  • LiuJiuXiaoShiTou
  • LiuJiuXiaoShiTou
  • 2017-07-31 20:25
  • 338

CodeVs_1098 均分纸牌问题

题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1...
  • SummerLotus_WXH
  • SummerLotus_WXH
  • 2017-12-26 20:41
  • 25

WPF实现蜘蛛纸牌游戏

WPF制作蜘蛛纸牌 一、结果展示 二、需求分析 1. 蜘蛛纸牌游戏逻辑分析: 胜利规则:移除游戏界面内的所有牌; 操作:通过鼠标拖动,将一组(张)牌从一个牌堆移动到另一个牌堆...
  • slx3320612540
  • slx3320612540
  • 2018-01-01 00:40
  • 86

一个C语言开发的炸金花纸牌游戏附带vs性能分析报告

一、游戏说明:         本次实验,我们小组两人开发的是一个模拟炸金花的纸牌游戏,游戏附有一个操作说明文档,按照文档上的操作方法,可以简单的开启游戏,整个程序包扩一个编译好的.exe文件,和两个...
  • wang_dong001
  • wang_dong001
  • 2016-04-22 16:55
  • 2674

java swing实现蜘蛛纸牌项目源码

大家好,今天给大家演示一下由Java实现的小游戏蜘蛛纸牌项目的运行,该游戏可运行在Java环境下,jdk版本不限,非常适合Java学习爱好者拿来参考学习,下面我们来看看项目运行。 1. 将项目导入到...
  • llqqxf
  • llqqxf
  • 2017-12-15 16:55
  • 116

【NOIP2002】均分纸牌

1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有...
  • Loi_Shirley
  • Loi_Shirley
  • 2016-11-14 21:43
  • 193
    个人资料
    • 访问:18017次
    • 积分:504
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:0篇
    • 译文:0篇
    • 评论:20条
    文章分类