【完美解析】蓝桥杯 省赛 杨辉三角形 python组 找规律+二分查找+组合数

article/2025/8/27 22:18:55

题目

在这里插入图片描述
在这里插入图片描述

看到最后如果还不懂你来打我~

分析

我们看到杨辉三角形很容易想到一个数的值等于它肩膀两个数的和。为此,可以不断通过前一行的数求出后一行的数,重复上面操作,直到找到目标为止。但是看了用例规模后发现其涉及到十的九次方,数值非常大,只有20%的用例才在10以内,如果以刚才枚举的方式求解的话得的分值并不高。因此可以看出,这是一道思维题,需要找出其中的规律来求解。

我们找找其中的规律,可以发现杨辉三角形具有以下特点:
在这里插入图片描述

1.对称性

杨辉三角形左右两边数字对称相等。

2.渐增性

越往中间数字越大,除最外层1外,越往下数字越大。

3.组合数
杨辉三角形里面的每一个元素都能用组合数表示。第N行的第M列可以表示成C(N-1,M-1),如6在第5行的第3列,它对应的组合数就是C(5-1,3-1),即C(4,2)。

思路

因为要找出第一次N出现的位置,根据对称性可知,N出现的位置必定在左边,因此只考虑左半边位置即可。因为越靠中间的数越大,所以我们可以从最中间的数,也就是从对称轴位置的数开始找。怎么找呢?斜着找。没错,就是斜着找。

我们先将三角形的右半部分去掉,然后再区分开每一斜行。

在这里插入图片描述
为什么要斜着找?

因为越靠近里面的斜行每一元素的值越大,而且总是较先出现的。以上图为例,6在倒数第二斜行出现了,他对应的位置是第5行第3列,也在倒数第三斜行出现了,对的位置是第7行第2列。很显然,倒数第二斜行的6的位置明显后于前者。出现这种情况的原因是每一斜行的增长速度不同,越靠近内行的数值增长速度越快。打个比方,同样做完一道题,内行的15分钟就做完了,外行的可能要花上1个小时。

为什么可以斜着找?

因为它们是有规律的:每一斜行的元素对应的列位置都没变。还是以6为例,6在第3列,6的斜行下一个元素10同样在第三列位置。(6:C(2, 4), 10:C(2, 5))。最后当我们找到元素后根据组合数规律就能反推出该元素在整个杨辉三角形的位置。

解决完上面的疑惑后,就要思考该怎么斜着找的问题了。在思考之前,我们先来看下斜行有哪些性质

  1. 在每一斜行中,越往下的元素越大。也就是说在中心轴位置的元素反而是斜行中最小的。(这里作为斜行的起始点)
  2. 在中心对称轴位置的元素组合数下限是上限的两倍(除1外)。如 2 = C(1,2),6 = C(2,4),10 = C(3:6)…即C(k,2k)
  3. 斜行同样可以用组合数表示。从全是1的最外层元素开始数(假设是第0斜行),则第 i 斜行的元素可以用组合数C(i, P)表示(P >= 2i,因为斜行的第一个元素就是C(i,2i),见性质2。因此,斜行中每往下一个元素P就加1,i不变)。

怎么斜着找?

因为在内斜行中元素总是较先出现的,所以我们要从内斜行开始从内往外开始找,找到第0行全是1的最外层为止。内到什么程度才行?内到第16行。我们知道在中心对称轴的元素是每一斜行中最小的,它的特点是 C( k, 2k ) 。

如果该斜行最小元素都已经超出10的9次方那么剩下的元素都是大于10的9次方的,也就是说这一斜行是没有意义的,不用考虑。经计算,只有16斜行以内的数才符合条件。

我们已经确定了起始元素,根据杨辉三角的渐增性,越往下元素值越大,说明就是有序的,可以使用二分查找提高查找效率。这里有二分查找和排序的模板,大家可以参考下我的这篇文章。

确定了查找的起点位置后就要确定查找的终点位置。我们以目标值作为我们的组合数下限。回到分析中的第三小点:组合数下限表示元素所在横行数-1,那么如果以目标值作为终点位置的组合数下限已经是非常大了,就算找不到也有第1斜行(全为1的是第0斜行)的公差为1的等差数列守着,所以一定能找到。

因为相同斜行的组合数上限不变,我们不断更换组合数下限的值,直到最后找到目标值即可。找到目标值后,根据此时的组合数上下限,结合杨辉三角组合数性质即可求出元素所在位置。以20: C( 3, 6 )为例,它是,第7行第4个元素。前面6行是个公差为1的等差数列,根据求和公式即可求出6行共有几个元素,最后再加4即为20所在位置。

精度问题: 因为最后输出的是整数,所以最后要使用int将计算结果中小数点后面的数去除。假设一个元素在几十万横行后面找到,那么求他的位置时它的前N项和是非常大的,但他所在的列数可能非常小,如果将他们相加后再转化为整型的话会造成数据丢失,导致与实际结果不符。这样放在蓝桥杯上的话只能够拿八十分。辛辛苦苦做出来的题却因为精度问题不能拿满分,属实可惜。这个问题我也想了好久没找到问题根源,最后看到一篇文章点醒了我,感谢 @Py小郑

代码

# 求组合数
def C(a, b):  # a为上限, b为下限res = 1for i in range(a):res *= b / a# 当结果大于目标值时无需继续运算,提高效率if res > target:return resb -= 1a -= 1return res# 二分查找目标元素
def search(k):# 起始下限,也就是对称轴位置的元素low = 2 * k# 终点下限high = target# 可能出现high 小于 low 的情况,比如目标值很小,但行数还在十多行的时候。# 这时候直接判断该斜行第一个元素也就是对称轴位置的元素的值是否是目标值即可。if high <= low and C(k, low) != target:return Falsewhile low <= high:mid = low + (high - low) // 2val = C(k, mid)if val > target:high = mid - 1elif val < target:low = mid + 1else:# 根据等差数列前N项和公式求出前面有多少个元素,然后再加上他所在的列数print(int(mid * (mid + 1) / 2) + k + 1)return Truereturn Falsetarget = int(input())
# range第二个参数必须是-1,因为第0斜行才有1。
for i in range(16, -1, -1):if search(i):break

结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/AXZ6dAt1.shtml

相关文章

【基础】杨辉三角python题解

题目 1231: 杨辉三角 时间限制: 1Sec 内存限制: 128MB 提交: 2261 解决: 750 题目描述 还记得中学时候学过的杨辉三角吗&#xff1f;具体的定义这里不再描述&#xff0c;你可以参考以下的图形&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 输入 输入数据包含多个…

杨辉三角形 python

class CircleQueue(object):def __init__(self,max50):# 队列最大容量self.max max# 存储队列元素的数组self.data [None for i in range(self.max)]# 队首指针self.front 0# 队尾指针self.rear 0def empty(self)::Desc判队空:return:如果队为空&#xff0c;返回True如果队…

蓝桥杯 省赛 杨辉三角形 python组(转)

# 求组合数 def C(a, b): # a为上限&#xff0c; b为下限res 1for i in range(a):res * b / a# 当结果大于目标值时无需继续运算&#xff0c;提高效率if res > target:return resb - 1a - 1return res# 二分查找目标元素 def search(k):# 起始下限&#xff0c;也就是对称轴…

蓝桥杯真题 杨辉三角形 python

专栏《蓝桥杯题目》 目录 【问题描述】 【输入格式】 【输出格式】 【样例输入】 【样例输出】 【评测用例规模与约定】 省流版本&#xff1a; 题目解析&#xff1a; 综上所述&#xff0c;写成代码如下所示&#xff1a; 【问题描述】 下面的图形是著名的杨辉三角形&#xff1a…

杨辉三角(Python)

杨辉三角性质: 每行首位数字都是1每行中间的各项数字都是它肩上两个数字的和第n行的数字有n个第n行的项数总比第n-1行多一个 解题思路: input来读取用户输入的行数。创建两个列表list1和list2,list1用于存放最后的结果(结果是二维列表),list2用于存放每一行的数字。根据性质输…

杨辉三角 Python(简单易懂)

杨辉三角&#xff08;最简单易懂&#xff09; 题目 编写两个函数&#xff0c;一个函数接收一个整数num为参数&#xff0c;生成杨辉三角形前num行数据&#xff0c;另一个函数接收生成的杨辉三角形并按以下形式输出&#xff0c;如图所示。 在图中&#xff0c;列出了杨辉三角形的…

MQ3

编者按】关于MQ&#xff0c;我以前只是有个大概概念。譬如之前&#xff0c;就是根据前端送过来的消息&#xff0c;format成后端所需要的消息格式&#xff0c;并将format后的消息放入一个Queue文件中&#xff0c;如果消息发送成功&#xff08;收到该request成功或者失败的respon…

MQ详解及四大MQ比较

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&a…

1.MQ介绍

什么是MQ mq&#xff08;message queue&#xff09;&#xff1a;面向消息的中间件&#xff08;message-oriented middleware&#xff09;是指利用高效可靠的消息传递机制与平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。 通过提供消息传递和消息排队…

RabbitMQ管理平台与主流MQ框架

目录 1. 什么是MQ 2. 应用场景 3. 主流MQ框架 4. Docker安装部署RabbitMQ 参数说明&#xff1a; 5. RabbitMQ管理平台 6. MQ的核心概念 7. springboot整合rabbitmq 7.1.安装好rabbitmq&#xff0c;登陆RabbitMQ管理平台&#xff0c;新增管理用户并设置权限 7.2.pom.xml添…

MQ高级(四)MQ集群

一、集群分类 RabbitMQ的是基于Erlang语言编写&#xff0c;而Erlang又是一个面向并发的语言&#xff0c;天然支持集群模式。 RabbitMQ的集群有两种模式&#xff1a; &#xff08;1&#xff09;普通集群&#xff1a;是一种分布式集群&#xff0c;将队列分散到集群的各个节点&…

MQ-2烟雾传感器解析

一、工作原理 可用于家庭和工厂的气体泄漏监测装置&#xff0c;适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此&#xff0c;MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点&#xff1a;灵敏度高、响应快、稳定性好、寿命长、驱动电路简…

MQ2

死信队列 什么是死信队列 一般来说&#xff0c;producer将消息投递到queue中&#xff0c;consumer从queue取出消息进行消费&#xff0c;但某些时候由于特定的原因导致queue中的某些消息无法被消费&#xff0c;这样的消息如果没有后续的处理&#xff0c;就变成了死信(Dead Lett…

MQ-2学习笔记

1.工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半导体。处于200~300摄氏度时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&#xff0c;从而使其电阻值增加。当与烟雾接触时…

01、RabbitMQ入门

目录 1.、什么是MQ 2、应用场景 3、主流MQ框架 4、Docker安装部署RabbitMQ 5、RabbitMQ管理平台 6、MQ的核心概念 单一生产者和单一消费者 7、springboot整合rabbitmq 执行测试方法testRabbitmq&#xff0c;控制台输出&#xff1a;receive msg : test rabbitmq messag…

MQ2烟雾传感器

1、MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时&#xff0c;传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2气体传感器可用于家…

MQ-2烟雾传感器

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置&#xff0c;适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此&#xff0c;MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点&#xff1a;灵敏度高、响应快、稳定性好、寿…

MQ-2烟雾浓度传感器(STM32F103)

本实验是通过串口调试助手显示STM32F103C8T6采集到MQ-2传感器的电压值。 一、 概述 1. 简介 MQ-2可用于家庭和工厂的气体泄漏监装置&#xff0c;适宜于液化气、丁烷、丙烷、甲烷、酒精、烟雾等的探测。它的优点是灵敏度高、响应快、稳定性好。寿命长、驱动电路简单以及方便安…

MQ-2烟雾传感器的原理及使用教程

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置&#xff0c;适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此&#xff0c;MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点&#xff1a;灵敏度高、响应快、稳定性好、寿命…

MQ-2烟雾传感器的使用

一、MQ-2烟雾传感器简介 MQ-2烟雾传感器采用在清洁空气中电导率较低的二氧化锡(SnO2)&#xff0c;属于表面离子式N型半导体。当MQ-2烟雾传感器在200到300摄氏度环境时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&a…