洛谷 P1031 均分纸牌(贪心)

贪心算法详细题解-----均分纸牌 题目描述 有N堆纸牌,编号分别为1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如N=4,4堆纸牌数分别为:①9②... 阅读详情

 P1031 均分纸牌

题目描述

有 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)

输出格式:

输出至屏幕。格式为:

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

输入输出样例

输入样例#1:  复制
4
9 8 17 6
输出样例#1:  复制
3



例如样例:我们用差值来表示,平均数为10,则4堆为 -1 ,-2,7,-4;如果 第 i 堆<0,就向后面借(如果i+1也是<0 ,不用管,i+1后面迟早有>0的补过来,不影响最优解,只不过把移动的顺序颠倒了),

例如:-1 ,-2,7,-4  -->0 ,-3,7,-4 -->0 ,0,4,-4 -->0 ,0,0,0;3次

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int mat[105]; 
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int sum=0;
		int num=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&mat[i]);
			sum+=mat[i];
		}
		sum/=n;
		for(int i=0;i<n;i++)
			mat[i]=mat[i]-sum;
		for(int i=0;i<n;i++)
		{
			if(mat[i]==0)
			{
				continue;
			}
			mat[i+1]=mat[i]+mat[i+1];
			num++;
		}
		printf("%d\n",num);
	}
	return 0;
}

洛谷P1031 B. 从左到右,根据当前的前i堆的和sum(i),与目标的前i堆的和sumstd(i),进行比较,如果多了,则向后方移动一次纸牌(更新a[i], sum[i], a[i+1]);C. 从右向左,根据每堆的纸牌数a[i],与每堆目标纸牌数ave比较,如果多了,则向前移动纸牌(更新a[i], sum[i-1], a[i-1])所以这题用贪心的思路做后,可以存在负数,可以贷款,这不影响这题的正确性。一个非常不严谨的证明是, nn点,至多 n−1 条边的有向图是一棵树,不可能有环。从最优方案的存在性上下手。 阅读详情

相关推荐

Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)

WFP驱动监控网络 WFP是微软推出来替代TDIHOOK、NDISHOOK等拦截网络通信的方案,WFP的框架非常庞大,在RING3和RING0各有一套类似的函数,令人兴奋的是,即使在R3使用WFP,也可以做到全局拦截访问网络。由于WFP的范围太广,实在难以一言概括,感...

墨鱼菜鸡 1033

有N堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:设计算法使得各堆纸牌同样多

n = int(input("请输入卡牌堆数:")) m =input("请输入各堆卡牌的个数") num = [int(i) for i in m.split()] #现在已经把输入的值分割成数组了。 sum = 0 for t in num: sum =sum + t arg = sum//n count = 0 for c in range(len(num)-1): if num[c]==arg: print(1) if num[c] >.

m0_46411554的博客 4058

零基础也能搞定!华为USG6000V防火墙WEB管理界面开启教程

本文详细介绍了华为USG6000V防火墙WEB管理界面的开启教程,从环境准备、网络配置到防火墙初始化,逐步指导用户完成图形化管理界面的搭建。特别适合零基础用户快速掌握企业级防火墙的可视化操作,提升安全管理效率。

grape的博客 786

XYOJ1249: 均分纸牌(playcard)

题目描述 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4...

qq_45499204的博客 4万+

【信息安全】seed-labs实验-Firewall Exploration Lab

本实验主要就是基于LKM和Netfilter实现简单的防火墙,重点是后者。路由器是有两个ip的,一个是外网ip,一个是内网ip每一次做完实验,都要做好收尾工作(比如:模块装入之后,要记得移除;iptables命令设置完规则之后,要把对应规则删掉)

可乐大牛的博客 5995

AquaCrop-OSPy学习笔记02:模型输入设置

AquaCrop-OSPy的输入设置

EWBA_GIS_RS_ER的博客 3693

【洛谷】P1031 均分纸牌(配数学证明)

题目地址: https://www.luogu.com.cn/problem/P1031 题目大意是,给定一个NNN维向量,每一维表示该位置的纸牌数,保证纸牌总数可以被NNN整除。现进行如下操作,允许从任意一堆纸牌中将若干纸牌移到左右临近的堆中(第一堆只能移到第二堆,最后一堆只能移到倒数第二堆)。问至少进行多少次操作可以让每堆纸牌数相等。 思路如下:考虑逆过程,先求出终了状态里每堆纸牌数,一步一步...

数学、算法爱好者的博客 2534

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1193

P1031 均分纸牌

P1031 均分纸牌 题目描述 有NNN堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例...

qingmingQAQ的博客 384

《派出你的AI同事:WorkBuddy案例实战》067:按行业分类的案例索引

按行业分类的案例索引 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 99

C语言读取CSV文件的方法1

逗号分隔值文件格式(CSV),以纯文本形式存储表格数据,它是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。本文介绍利用C语言标准库中的一个字符串处理函数 strtok()来对CSV文件内容进行读取的基本方法

白马负金羁 1万+

洛谷P1031 均分纸牌【贪心】

题目链接:洛谷P1031 均分纸牌 程序说明: 贪心算法,先计算出平均数即每堆牌的数目,规定每一堆牌只能由其相邻的右侧牌堆提供(这里的提供有正有负),如果某牌堆的数目恰好已经是正确的数目了则跳过该牌堆。 代码如下: #include <iostream> using namespace std; const int MAX = 10000; int n, sum, cnt, a[M...

cutlery1137的博客 366

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

洛谷 P1031 [NOIP 2002 提高组] 均分纸牌 (贪心算法)

移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N−1 的堆上;其实这些担心纯属多余,a[ n - 1 ]移动完成后,a[ n ]一定等于0,不然怎么做到平均数为sum呢?如果a[ 1 ] ~ a[ k - 1 ] 都等于零,而a[ k ] ≠ 0 ,那么a[ k + 1 ] = a[ k + 1 ] + a[ k ]。注意:由于我们每堆牌都要一次移好,所以a[ k ]移好之后就不用管了,所以a[ k ] = 0可有可无。

elisaruo的博客 1373

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

(贪心)洛谷P1031均分纸牌

洛谷P1031均分纸牌 思路: 离散化没怎么学,题库a不动了,写点思维题放松下。 求平均数,算差值。差值为0就不用动他,其他的转嫁给下一堆。 代码: #include<bits/stdc++.h> const int N=1e4+10; const int mod=1e7+9; const int maxn=0x3f3f3f3f; const int minn=0xc0c0c0c0; ...

Z7784562的博客 275

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

贪心:P1031 均分纸牌(洛谷)

本题链接 这题贪心算法是关键,而且用到的思维比较巧妙。 这里引用洛谷大佬昵称是啥??的解释: 首先这里有一个简化的思想。考虑到分好后所有的纸牌数都等于平均数,我们干脆以平均数作为标准,让所有的纸牌数减去平均数,如果是正数表明需要移走这个正数数量的纸牌,注意负数需要移走的牌数就是这个负数本身,而0则是正好了,下文中把处理过的牌组就叫做简化后的卡组。 贪心思想则是从左到右依次枚举,将每个卡组上简化后的数移动到右边的卡组(再说一遍,是负数的就移走负数),这样最后一组牌就自动变成0了 但是如果简化后的牌组中有0怎么

bossmmm的博客 323

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

洛谷 P1031 均分纸牌 贪心

P1031 均分纸牌 贪心 题目链接 代码如下 //题目只让统计次数,所以变简单了不少 //思路就是,先求平均值,然后和平均值一样的不用调整,不一样的要调整 //因为是相邻之间调整,所以把前俩相加之和算作下一个,直到0为止,加了几次就调整了几次 //0之后如果还有数就接着加,一样道理 #include&lt;cstdio&gt; using namespace std; int main()...

candiceyj的博客 369

洛谷P1031 均分纸牌(贪心)

题目描述 有N堆纸牌,编号分别为 1,2,…,N。1,2,…,N。1,2,…,N。每堆上有若干张,但纸牌总数必为NNN的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为111堆上取的纸牌,只能移到编号为222的堆上;在编号为NNN的堆上取的纸牌,只能移到编号为N−1N−1N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如N=4N=4N=4,444堆纸牌数分别为: ①9②8③17④6①9②8③17④6①9②

Running Snail 309

洛谷 P1031 [NOIP2002 提高组] 均分纸牌(贪心)

有N堆纸牌,编号分别为12N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如N4时,4堆纸牌数分别为98176。移动3498131039111010110101010。

2302_79440616的博客 725

洛谷 P1031 均分纸牌 (贪心思想)

均分纸牌  题目链接 这道题是一道贪心问题(也有不用贪心方法写的)。 解题思路: 显然我们要先求和,把牌堆的平均值求出。 题目上说,每次只能向左右两边移动一次(第一堆,最后一堆除外),最少要多少次。 我们不如从一组实例来讲吧: 上述十个数字,平均值为10. 我们,这样看: 第一个数字等于10,忽略。 第二个数字小于10。第三个数字小于10。恰好第四个大于10。第四个或许能给第二、...

JustNo 564

【贪心】洛谷 P1031 均分纸牌

题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如 N=4,4 堆纸

。。。。 826

[洛谷]P1031 均分纸牌 (#贪心)

题目描述 有NN堆纸牌,编号分别为 1,2,…,N1,2,…,N。每堆上有若干张,但纸牌总数必为NN的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为11堆上取的纸牌,只能移到编号为22的堆上;在编号为NN的堆上取的纸牌,只能移到编号为N-1N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 ...

A.pro的博客 383

【题解】洛谷P1031均分纸牌[NOIP2002] 贪心+模拟

题目链接 /*模拟 从前往后扫描数组,判断距离平均数还差几张 如果小于平均数,则用后面那张补过来 如果大于平均数,则往后补*/ #include&amp;lt;cstdio&amp;gt; int a[110]; int main(){ int t,n,i,step=0,sum=0; scanf(&quot;%d&quot;,&amp;amp;n); for(i=1;i&amp;lt;=n;i++){ ...

翻过这座山,他们就会听到你的故事 321

洛谷P1031 [NOIP2002 提高组] 均分纸牌

洛谷P1031均分纸牌代码及注释思路

2301_80284302的博客 292

【洛谷 P1031】[NOIP2002 提高组] 均分纸牌 题解(贪心)

有N堆纸牌,编号分别为12N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如N4时,4堆纸牌数分别为98176。移动3498131039111010110101010。

HEX9CF的技术博客 401

洛谷 P1031 [NOIP 2002 提高组] 均分纸牌

n:纸牌的堆数。cards:一个动态数组,用于存储每堆纸牌的数量。total:所有纸牌的总数。avg:每堆纸牌应该达到的平均数。moves:记录移动的次数。这道题通过贪心算法高效地解决了纸牌均分的问题。关键在于理解每次移动的最优选择是如何影响全局的,以及如何通过简单的差值传递来实现最少移动次数。代码实现简洁明了,适合初学者理解和掌握贪心算法的基本应用。通过这道题,我们不仅学会了如何解决具体的纸牌移动问题,还掌握了贪心算法在实际问题中的应用方法,这对于解决其他类似的最优化问题具有重要的启发意义。

Yiping2012ABC的博客 1175
上一篇: 51nod 1009 数字1的数量 (数位dp、数学)
下一篇: 51nod 1001 数组中和等于K的数对(排序+二分)
BBHHTT
博客等级 码龄9年 92粉丝 299原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值