均分纸牌

题目描述:

有\(N\)堆纸牌,编号分别为\(1,2,…,N\)。每堆上有若干张,但纸牌总数必为\(N\)的倍数。可以在任一堆上取若干张纸牌,然后移动。

移牌规则为:在编号为\(1\)堆上取的纸牌,只能移到编号为\(2\)的堆上;在编号为\(N\)的堆上取的纸牌,只能移到编号为\(N-1\)的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

分析:

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

一看到最少这个字眼,就应该想到贪心或者动态规划

而我的思路是:

因为题目上说:

纸牌总数必为N的倍数

现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

所以我就想:那么我用每堆的纸牌数去减掉平均数,不就是这堆纸牌需要多少张牌才满足题目条件吗?

又因为:

移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N*的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

所以,如果这堆的纸牌数>0,我们就需要将它的多余纸牌移动到纸牌数<0的纸牌堆上去。

反之,如果这堆的纸牌数<0,我们就需要将它的缺少的纸牌从纸牌数>0的纸牌堆上移动到它上去。

于是,有了思路,代码打起来也就非常简单了。

代码实现:

#include<iostream>
#include<cmath>
using namespace std;
int n;//纸牌堆数
int a[10005];//储存纸牌数
int num=0;//纸牌的平均数
int ans=0;//移动次数
int flag=1;//表示纸牌不需要移动
int main()
{
cin>>n;//输入纸牌堆数
for(int i=1;i<=n;i++)
{
cin>>a[i];//输入每堆的纸牌数
num+=a[i];//纸牌的总数进行累加
}
num/=n;//num变为总纸牌数的平均数
for(int i=1;i<=n;i++) a[i]-=num;//将每堆纸牌数变为距离满足条件的纸牌数的数
for(int i=1;i<=n;i++) if(a[i]!=0) flag=0;//flag==0,表明需要移动
if(flag==0)//需要移动,那么就开始吧!
{
for(int i=1;i<=n;i++)//从头遍历到尾
{
if(a[i]>0)//如果它的纸牌数多了
{
a[i+1]+=a[i];//就把它移动到下一堆去
a[i]=0;//这一堆满足条件
ans++;//移动次数++
}
if(a[i]<0)//如果它的纸牌数少了
{
a[i+1]-=abs(a[i]);//那么它下一堆的纸牌就移动到它上来
a[i]=0;//这一堆满足条件
ans++;//移动次数++
}
if(a[i]==0) continue;//如果它满足条件,就不鸟它了。
}
cout<<ans<<endl;//输出答案
}
if(flag==1) cout<<ans<<endl;//如果本来就满足条件,直接输出答案(0)
return 0;
}

最新文章

  1. Repeater、地址栏传值、Response--2016年12月30日
  2. gdb脚本
  3. Javascript备忘复习笔记1
  4. ubuntu 安装php7.1
  5. 回文串--- Girls&#39; research
  6. 【nginx】配置文件的优化
  7. sql date时间加减几天几小时
  8. iOS Plist文件,增删改查
  9. js风格技巧
  10. 简单的网页布局效果html5+CSS3
  11. iOS多线程的基本使用
  12. Mac下安装BeautifulSoup
  13. 遇到的面试题-sql
  14. [UOJ86]mx的组合数——NTT+数位DP+原根与指标+卢卡斯定理
  15. 正版phpstorm,webstorm,goland(Jetbrains系列都可以)免费激活步骤(图文详解)(亲测有效)
  16. 学Java的第17天。呃。。。今天有点奇葩
  17. 《算法》第四章部分程序 part 17
  18. SVN不显示对号的解决方法
  19. [Todo] Java及C++ Exception整理
  20. [转]改变UITextField placeHolder颜色、字体

热门文章

  1. word embedding 精要整理
  2. Jenkins忘记 admin 密码
  3. Python自学:第五章 动手试一试 4-3
  4. Dart编程数字Number
  5. Swift 环境搭建
  6. tomcat部署安全证书文件(阿里云SSL证书)
  7. 简单理解js回调函数
  8. Android Canvas save和restoreToCount
  9. 剑指offer——26反转链表
  10. mybatis浅显认识