蓝桥杯——算法训练之字母图形,区间K大树查询,矩阵乘法,分解质因数,矩形面积交

tech2026-04-18  1

字母图形

问题描述:利用字母可以组成一些美丽的图形,下面给出了一个例子

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形

输入格式:输入一行,包含两个整数n和m,分别代表你要输出的图形的行数和列数

输出格式:输出图形

解题思路:会发现图形的左上到右下的斜线上的字母一致且坐标相反的字母也一致,通过在循环中判断每个位置的字母应该是什么,最终将图形输出。

m, n = map(int, input().split()) for i in range(1, m+1): # 控制行数 for j in range(1, n+1): if j == n: print(chr(abs(i-j)+65), end='\n') else: print(chr(abs(i-j)+65), end='')

区间K大数查询

问题描述:给定一个序列,每次询。问序列中第1个数到第r个数中第K大的数是哪个

输入格式:

第一行包含一个数n,表示序列的长度 第二行包含n个正整数,表示给定的序列 第三个包含一个正整数m,表示询问个数 接下来m行,每行三个数l,r,k,表示询问序列从左往右第l个数到第r个数中,k大数是哪一个,序列元素从1开始标号

输出格式:总共输出m行,每行表示一个k大数

解题思路:首先根据l和r,提取出之间的数字并组成列表,进行从大到小排序,再根据k输出结果。

n = int(input()) # 第一行数值 a = list(map(int,input().split())) # 第二行序列 m = int(input()) # 第三行数值 sl = [[i for i in map(int, input().split())]for j in range(m)] for i in range(m): l = int(sl[i][0])-1 r = int(sl[i][1]) k = int(sl[i][2]) sll = sorted(a[l:r],reverse=True) print(sll[k-1])

矩阵乘法

问题描述:输入两个矩阵,分别是ms,sn大小。输出两个矩阵相乘的结果

输入格式:

第一行,空格隔开的三个整数m,s,n(均不超过200) 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j) 接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)

输出格式:m行,每行n个空格隔开的整数,输出相乘后的矩阵C(i,j)的值

解题思路:矩阵C应该是m行n列,其中(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。如:C(1,1)=(1,0,-1)(0,1,3)=10+0*1+(-1)*3=-3

import numpy as np while True: try: m, s, n = map(int, input().split()) a = [[0] * s] * m for i in range(m): a[i] = input().split(' ') b = [[0] * n] * s for j in range(s): b[j] = input().split(' ') z = np.array(a) x = np.array(b) c = np.mat(a)*np.mat(b) print(c) except: break

分解质因数

问题描述:求出区间[a,b]中所有整数的质因数分解

输入格式:输入两个整数a,b

输出格式:每行输出一个数的分解,形如k= a1 * a2 * a3…

解题思路:把每次质因数分解的结果存放到一个字典result里面,假如我们分解3到40之间的式子,我们分解到36之后,进行一次运算变成18之后就可以直接把前面的结果从字典里拿出来,如:36/2=18之后36更新为18,18/2=9再更新为9,9/3=3,3是质数,不用更新了,到此结束

while True: try: def f(n): for i in range(2, int(n/2+1)): if n%i == 0: print(i, end="") print("*", end="") return f(n/i) # 返回取余后的结果 print(int(n)) # 如果是质数,直接输出 if __name__ == "__main__": a,b = map(int, input().split()) for i in range(a, b+1): print("%d=" % i, end="") # 在调用函数之前输出等式左边的数 f(i) except: break

矩形面积交

问题描述:平面上有两个矩形,它们的边平行于直角坐标系的x轴或y轴,对于每个矩形我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。

输入格式:输入仅包含两行,每行描述一个矩形,在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示

输出格式:输出仅包含一个实数,为交的面积,保留到小数后两位

解题思路:每个矩形左下角的点可以取其中横坐标大的,每个矩形右上角的点可以取其中横坐标小的,纵坐标同样处理即可。如果右边的横坐标比左边的小说明无交集,如果上面的纵坐标比下面的小,说明无交集。

while True: try: m, n, z, x = map(int, input().split()) m1, n1, z1, x1 = map(int, input().split()) a_max = max(m, z) a_min = min(m, z) a_max1 = max(n, x) a_min1 = min(n, x) b_max = max(m1, z1) b_min = min(m1, z1) b_max1 = max(n1, x1) b_min1 = min(n1, x1) if(a_max <= b_min or b_max <= a_min or a_min1 >= b_max1 or b_min1 >= a_max1): print("0.00") else: x1 = max(a_min, b_min) x2 = min(a_max, b_max) y1 = max(a_min1, b_min1) y2 = min(a_max1, b_max1) product = (x2-x1)*(y2-y1) print("%.2f" % product) except: break
最新回复(0)