均分纸牌

题目描述:

有\(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. 干货满满!10分钟看懂Docker和K8S

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

  2. vue生态系统之vue-router

    一.vue-router安装与使用 1.安装 进入项目目录中安装vue-router模块 E:\vueProject\webpackProject>cnpm install vue-router ...

  3. 前置控制器一DispatcherServlet

    org.springframework.web.servlet.DispatcherServlet 前言 DispatcherServlet是SpringMVC的核心控制器,就像是SpringMVC的 ...

  4. C/C++ 智能指针

    // 转载自 :https://www.cnblogs.com/wuyepeng/p/9741241.html { 为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new ...

  5. delphi xe10 麦克风、摄像头操作

    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction; // 通过手机摄像头获取图片TakePhotoFromLibraryAction1: T ...

  6. R语言 环境设置

    尝试在线环境 你真的不需要设置自己的环境来开始学习R编程语言. 原因很简单,我们已经在线设置了R编程环境,以便您可以在进行理论工作的同时在线编译和执行所有可用的示例. 这给你对你正在阅读的信心,并用不 ...

  7. 经典换根dp——hdu2196

    给定一棵边权树,求距离每个点最远的点,输出这个距离 #include<bits/stdc++.h> using namespace std; #define N 10005 ]; int ...

  8. NX二次开发-UF_MODL_ask_distance_tolerance获取建模的长度公差

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...

  9. Java-Class-C:com.alibaba.fastjosn.JSON

    ylbtech-Java-Class-C:com.alibaba.fastjosn.JSON 1.返回顶部 1.1.import com.alibaba.fastjson.JSON;import co ...

  10. Harbor任意管理员注册漏洞复现CVE-2019-16097

    注册时抓包 添加poc "has_admin_role":true 管理员权限 POC POST /api/users HTTP/1.1 Host: 127.0.0.1 Conte ...