蓝桥杯-杨辉三角形-python

article/2025/8/27 22:28:37

题目

在这里插入图片描述
可以结合目录来理解文章~


原始方法

这个方法可以拿到40分。N数值比较大的时候,运行时间会超过限制。

思路

逐行生成杨辉三角,找到了需要的N以后就停止循环,并输出对应的位置。

变量解释

用于计算N的位置的公式如下:

pos = (1 + i)*i/2 + j

其中,i是从0开始的,代表N所在的行。j是从0开始的,代表N在所在行的位置(注意,由于每行行首会有一个用来占位的"0",因此也可以认为j是从1开始的)。

优化技巧

在基本思路的基础上,用到了两个优化存储的技巧。

  1. 杨辉三角只保留程序运行到的行。

previous_linenew_line交替存储,这样就不必保存对解题无用的、太过久远的行。

  1. 将杨辉三角保留一半。

由于杨辉三角是对称的,每行只保留前一半以节约空间。计算时,需要考虑奇数行和偶数行的影响。

完整代码

# Boundary test!
n = int(input())'''
将杨辉三角保留一半,以节省空间和时间
'''# 初始化第一行
previous_line = [0,1]i = 0 # 标记当前行
is_odd = -1 # 标记旧行是否为奇数行,第0行是偶数行,故初始化为-1while(True):# 取出旧行previous_line = previous_line# 计算新行new_line = [0] # 保持新行第一个为0for k in range(len(previous_line)-1):new_line.append(previous_line[k] + previous_line[k+1])if is_odd == 1:new_line.append(2*previous_line[-1])# 标记所需元素在新行的位置i = i + 1 # 标记新行is_odd = -is_odd # 标记新行是否为奇数行if n in new_line:j = new_line.index(n) break # 将计算得到的新行置为旧行previous_line = new_linepos = (1 + i)*i/2 + jif n == 1:print(1)
else:print(int(pos))

满分方法

基本复刻了下面这个博客的代码和思想:

第十二届蓝桥杯B组C/C++省赛—H题(杨辉三角)_思维题_萌小帝的博客-CSDN博客

下文是我对这个方法的理解,可能会有一些地方说的不够清楚,推荐和大佬的原文比对着看(不过我有些标记和原文不一样,得注意一下)。如果有错误希望大家可以帮忙指正。

前言

这份代码能过洛谷的评测,在蓝桥杯系统里只有70分,,,明明自己测的所有特殊值都是对的,调了很久还是放弃了。如果有大佬能告诉我为什么过不了蓝桥杯我将感激不尽。

思路

这个方法可以概括为斜行查找

斜行的含义

  1. 由于杨辉三角的对称性,可以只保留左半部分进行考虑。

在这里插入图片描述

​ 也就是这样:

在这里插入图片描述

  1. 斜行的引入

    通过图,我们可以发现通过行和列的枚举是不好的,看数据1e9也就是十亿,这是个很大的工程,因此我们试想可不可以从斜行来观察呢?

    绘制示意图,图中的蓝色箭头标明了斜行的走向。

在这里插入图片描述

​ 为了表达清楚,将杨辉三角原来的行称为标准行。标准行和斜行都是从0开始的。

  • 观察每个斜行的首元素,可以得到:第0斜行的首元素为C(0,0),第1斜行为C(1,2),第2斜行为C(2,4),第3斜行为C(3,6)…
  • 求每个斜行的首元素的通项,易得:若当前为第i个斜行,则该斜行首元素为C(i,2i)。

​ 考虑杨辉三角和二项式系数的关系:

​ 杨辉三角,是二项式系数C(n,m)在三角形中的一种几何排列。

对应本题,C(n,m)中的n对应于斜行的行数,m对应于标准行的行数。 这个概念是之后解题的重要依据。

枚举的思路

  • 第16斜行开始向前枚举。在斜行中查找n,出现等于n的数直接返回位置。
  • 对于查找,由于斜行元素是单调递增的,因此可以对每个斜行采用二分的方法查找n。
  • 对于位置,可以在查找的时候确定。遍历得到n所在标准行r和所在斜行k ,通过等差数列求和公式 r*(r+1)/2计算n之前所有标准行的元素个数再加k+1。

加粗内容的补充解释:

  1. 为什么从第16斜行开始?

    题目给定的n最大到1000000000。C(17,34)=2333606220,是斜行首元素第一次大于1000000000(1e9),由于每个斜行内的元素是单调递增的,因此17斜行的每一个值都必定大于1e9。又由于每个斜行的首元素也是单调递增的,因此17斜行之后的所有斜行的所有元素都是大于1e9的。

    因此,只需要考虑前16斜行即可。

  2. 为什么向前枚举时找到的第一个n就是杨辉三角中第一次出现的n?

    等价于证明:若第i和第i+j个斜行中都出现了n,则第i+j个斜行中的n一定出现在第i个斜行中的n之前。

    以n=6为例:

    画个图可以比较直观的解释这个问题。

    考虑第1个斜行出现的6。可以看到,红色区域全是大于6的值,也就是说,6不可能在这一区域出现。若有6在第1个斜行之后的斜行出现,则必然是在这个6之前的。

在这里插入图片描述

  • 斜行内的元素的通项是什么?

    考虑杨辉三角和二项式系数C(n,m)的关系,元素在斜行中每向前一步,对应标准行向下一行。因此,第k个斜行第一个元素为C(k,2k),第二个元素就是C(k,2k+1),依次类推。

代码

# Boundary test!
# n = int(input())'''
斜行查找
'''
import sys
# ====================
# 求解组合数C的函数
# ====================
def C(a, b):top = 1bot = 1i = bfor j in range(1, a+1):top *= ibot *= ji -= 1return top//bot# ====================
# 对第k个斜行进行二分查找的函数
# ====================
def bi_search(k):l = 2*kr = max(n, l)while r > l: # l是偏小的,r是偏大的mid = (l + r)//2median = C(k, mid)if median == n: breakelif median > n:r = mid - 1else:l = mid + 1# 没找到n,继续遍历if C(k, r) != n:return False# 找到n,输出位置print((1 + r)*r//2 + k + 1)return True# ====================
# 程序主体
# ====================    
n = int(input())# 如果是1,直接输出
if n == 1:print(int(1))sys.exit()# 向前枚举
for i in range(0, 16):k = int(16 - i)# 找到n就跳出来if bi_search(k):break

下面这个博主的代码可以拿蓝桥杯系统的满分。

第十二届蓝桥杯 杨辉三角形 Python题解 满分_qq_26557263的博客-CSDN博客


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

相关文章

第十二届蓝桥杯 杨辉三角形 Python题解 满分

原地址https://artrajz.cn/index.php/archives/32/ 前言 其实道题在寒假的时候就做了,现在有机会发出来了。(〃‘▽’〃) 题目 思路 参考了大佬斜行查找的思路,为了便于观察和叙述,我把杨辉三角形如图排一下 1 1 1 1 2 1 1 3 3 …

python杨辉三角居中_利用python打印杨辉三角

用python打印杨辉三角 介绍 杨辉三角,是初高中时候的一个数列,其核心思想就是说生成一个数列,该数列中的每一个元素,都是之前一个数列中,同样位置的元素和前一个元素的和。 正好在python中,也就是生成一…

杨辉三角形(Python)

杨辉三角形的规则就是每行的第一个数字和最后一个数字为1之外,其余每个数字等于上一行对应两个数字的和。 1、使用二维数组实现 def triangle(row):result []for i in range(row):if i 0: # 第一行result.append([1])elif i 1: # 第二行result.append([1,1])e…

杨辉三角Python解法

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 例: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 解析: 大于等于2行以后&#x…

pythonfor杨辉三角,python实现杨辉三角 python实现杨辉三角的几种方法代码实例

想了解python实现杨辉三角的几种方法代码实例的相关内容吗,看,月亮在跳舞在本文为您仔细讲解python实现杨辉三角的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python实现杨辉三角,python杨辉三角实现方法&am…

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

题目 看到最后如果还不懂你来打我~ 分析 我们看到杨辉三角形很容易想到一个数的值等于它肩膀两个数的和。为此,可以不断通过前一行的数求出后一行的数,重复上面操作,直到找到目标为止。但是看了用例规模后发现其涉及到十的九次方&#xff0…

【基础】杨辉三角python题解

题目 1231: 杨辉三角 时间限制: 1Sec 内存限制: 128MB 提交: 2261 解决: 750 题目描述 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 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:如果队为空,返回True如果队…

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

# 求组合数 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):# 起始下限,也就是对称轴…

蓝桥杯真题 杨辉三角形 python

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

杨辉三角(Python)

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

杨辉三角 Python(简单易懂)

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

MQ3

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

MQ详解及四大MQ比较

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

1.MQ介绍

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

RabbitMQ管理平台与主流MQ框架

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

MQ高级(四)MQ集群

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

MQ-2烟雾传感器解析

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

MQ2

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

MQ-2学习笔记

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