均分纸牌

题目描述:

有\(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;
}

【题解】P1440 均分纸牌的更多相关文章

  1. code vs 1098 均分纸牌(贪心)

    1098 均分纸牌 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解   题目描述 Description 有 N 堆纸牌 ...

  2. NOIP200205均分纸牌

                                                                  均分纸牌 描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张 ...

  3. wikioi 1098 均分纸牌

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

  4. NOIP2002 均分纸牌

    题一 均分纸牌 (存盘名: NOIPG1) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为: ...

  5. 【洛谷p1031】均分纸牌

    [博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...

  6. 洛谷P1368 均分纸牌(加强版)

    P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...

  7. 洛谷P1031 均分纸牌

    P1031 均分纸牌 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌 ...

  8. 洛谷 P1031 均分纸牌

    P1031 均分纸牌 这道题告诉我们,对于实在想不出算法的题,可以大胆按照直觉用贪心,而且在考试中永远不要试着去证明贪心算法,因为非常难证,会浪费大量时间. (这就是你们都不去证的理由??) 这道题贪 ...

  9. 均分纸牌(Noip2002)

    1320:[例6.2]均分纸牌(Noip2002) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 3537     通过数: 1839 [题目描述] 有n堆纸牌,编 ...

随机推荐

  1. ConcurrenHashMap介绍1.8 中为什么要用红黑树

    java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据. 红黑树相当于排序数据.可以自动的使用二分法进行定位.性能较高. 在Concurren ...

  2. HTTP状态码(转)

    转自菜鸟教程:https://www.runoob.com/http/http-status-codes.html HTTP状态码共分为5种类型: HTTP状态码分类 分类 分类描述 1** 信息,服 ...

  3. Jenkins 搭建 .NET Core 持续集成环境

    关于c#的.Net FrameWork 的集成环境以及MsBuild的配置可以看     jenkins搭建.NET FrameWork持续集成环境 这篇文章     关于.NET Core 这个项目 ...

  4. 关于scroll、client、offset和style中的height、width、top以及bottom属性

    内容和图片来自offset.scroll.client三大家族, 此处仅作记录使用 client offset scroll

  5. Kotlin Hello World

    { https://github.com/zhmmmm/Kotlin }

  6. bzoj1009题解

    [解题思路] 先KMP出fail数组,再用fail数组求出M[i][j],表示上一次匹配到第i位,这次可以遇到多少种不同的字符,使之转而匹配到第j位. 设集合S=[1,m]∩N 又设f[i][j]表示 ...

  7. Python pillow库安装报错

    报错信息: D:\pythontest\duanxinhongzha>pip3 install pillowCollecting pillow Could not find a version ...

  8. NX二次开发-删除经典工具栏UF_UI_remove_toolbar

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  9. ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别

    1:QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便需要提一下的是,QueryTask进行查询的地图服务并 不必项加载到Map中进行显示.Query ...

  10. 笔试题-求小于等于N的数中有多少组素勾股数

    题目描述: 一组勾股数满足:a2+b2=c2: 素勾股数:a,b,c彼此互质. 输入正整数N: 输出小于等于N的数中有多少组勾股数. 例: 输入:10 输出:1 思路:我是直接暴力破解的…… 首先找出 ...