Python代码解蓝桥杯第十三届省赛(C/C++大学B组)赛题。
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
九进制正整数 (2022)9 转换成十进制等于多少?(本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。)
最大运行时间:1s
最大运行内存: 512M
num = int('2022', 9)
print(num)
当然,老老实实用“算法”干,也比较不难,按位求得十进制值,累加即解。可以有多种数据结构和代码拼搭可以选择,用什么样子的代码结构,任您喜好。今次我选用“变量累加算法”和int()直接转换。对进制转换想了解更多,可以点击“ 进制转换学习笔记”跳转我的学习笔记博文参阅。
num0 = '2022' # 九进制整数
#num = list(num0)
#s = [num.pop() for i in num[:]]
s = [num0[i] for i in range(-1, -(len(num0)+1), -1)]# 反转九进制低位在前,可凭喜好选择list.pop()或者字符串切片。
ans = 0
multiple = 0
for i in s:
ans += int(i)*(9**multiple)
multiple += 1
if __name__ == '__main__':
print(f"\nI. 九进制转换十进制:\n{'':~^50}\n")
input(f"自码程序计算:{num0} -> {ans}\n直接int(num, 9):{num0} -> {int(num0, 9)}\n")
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字:123 、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。
例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。
小明想知道在整个 2022 年份中,一共有多少个顺子日期?
最大运行时间:1s
最大运行内存: 512M
这道题目不难。顺子,即类“自然数”,等差为1的等差数列。要统计的2022年,年份数字与后面的任何月份都成不了顺子,遍历找“顺子”只针对月日四位日期就好。这可以减少遍历字符,稍微加快遍历速度。
我采用边生成日期边统计“顺子日期”,只遍历全年日期一遍。
生成日期时,2月照例是要根据闰年与否来定最后一天的;4、6、9、11月,要设定只生成30天的“机关”;余下大月遍历到底for day in range(1, 32)。
闰年判定
year = 2002
leap_year = ((not year%4 and year%100) or not year%400) # 闰年判定。
顺子日期判定函数
def isstraight(date: str) -> bool:
''' 判定顺子日期 '''
date = [int(i) for i in date[4:]]
tem = []
for i in range(3):
if date[i] == date[i+1] - 1:
tem.append(date[i])
else:
tem = []
tem.append(date[-1])
if len(tem) >= 3:
return True
return False
遍历全年日期
def count() -> int:
''' 统计某年的顺子日期 '''
count = 0
for month in range(1, 13):
for day in range(1, 32):
if month in (4, 6, 9, 11) and day > 30:
break # 小月丢弃生成31日。
elif month == 2:
if leap_year and day > 29:
break
elif not leap_year and day > 28:
break
strdate = f"{year}{month:0>2}{day:0>2}"
if isstraight(strdate):
count += 1
print(strdate, end=', ')
return count
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在第几天实现做题数大于等于 n 题?
输入一行包含三个整数 a、b 和 n。
输出一个整数代表天数。
输入
10 20 99
输出
8
对于 50%的评测用例,1 ≤ a, b, n ≤ 106,对于 100%的评测用例,1 ≤ a, b, n ≤ 1018。
最大运行时间:1s
最大运行内存: 256M
week = [a]*5 + [b]*2
根据输入,生成一周每天刷题量数组:
对 n 大于一周总刷卡题量,用其取模,直到小于一周刷题问题。
代码可以用减,也可以用整除//:
sum_week = sum(week)
while n > sum_week:
n -= sum_week
result += 7
result += 7 * (n // sum_week)
n = n % sum_week
用整除 // 更好,不用循环,代码更简洁。
for 循环遍历找寻完成量的不足一周的刷题量用的所用天数,累加到前面累积到的整周天数:
for i in week:
if n <= 0:
break
n -= i
result += 1
数据输入
while True: # 循环输入,直到正输入。
try:
a, b, n = map(int, input('\n输入:').strip().split())
break # 输入无异常,退出循环。
except Exception as error:
print(f"\n{error}\n{'输入错误!':~^45}")
完整代码
def count_do_exercise(a: int, b: int, n: int) -> int:
''' 刷题统计 '''
week = [a]*5 + [b]*2
#input(week) # 调试用语句。
result = 0
sum_week = sum(week)
'''while n > sum_week:
n -= sum_week
result += 7'''
result += 7 * (n // sum_week)
n = n % sum_week
for i in week:
if n <= 0:
break
n -= i
result += 1
return result
if __name__ == '__main__':
print(f"\nIII、刷题统计\n{'':~^50}")
while True: # 循环输入,直到正输入。
try:
a, b, n = map(int, input('\n输入:').strip().split())
break # 输入无异常,退出循环。
except Exception as error:
print(f"\n{error}\n{'输入错误!':~^45}")
print(f"\n输出:{count_do_exercise(a, b, n)}\n")
爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排,爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木;当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木;直到修剪了最左的灌木后再次调转方向;然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
一个正整数 N,含义如题面所述。
输出 N 行,每行一个整数,第 i 行表示从左到右第 i 棵树最高能长到多高。
输入
3
输出
4
2
4
对于 30% 的数据, N≤10,
对于 100% 的数据, 1
最大运行时间:1s
最大运行内存: 512M
对于左边的灌木来说,长的最高的时候应该是从自己出发向右走再返回自己的长度。
对于正中间的灌木来说,长度最高的时候就是从自己出发再返回。
对于右边的灌木来说,长的最高的时候应该是从自己出发向左走再返回自己的长度。
进制规定了数字在数位上逢几进一。
X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X 进制数 321 转换为十进制数为 65 。
现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制, 最低为二进制。请你算出 A−B 的结果最小可能是多少。
请注意:你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。
第一行一个正整数 N,含义如题面所述。
第二行一个正整数 Ma,表示 X 进制数 A 的位数。
第三行 Ma 个用空格分开的整数, 表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。
第四行一个正整数 Mb, 表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。
请注意:输入中的所有数字都是十进制的。
输出一行一个整数,表示 X 进制数 A−B 的结果的最小可能值转换为十进 制后再模 1000000007 的结果。
输入
11
3
10 4 0
3
1 2 0
输出
94
当进制为:最低位 2 进制,第二数位 5 进制, 第三数位 11 进制时,减法得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,差值是 94。
对于 30% 的数据, N ≤ 10; Ma, Mb ≤ 8;
对于 100% 的数据,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.
最大运行时间:1s
最大运行内存:256M
首先倒叙存储二进制整数A与B,按照贪心思想,当进制最小时为A-B的最小值,最小进制为max(a[i],b[i]) + 1,若进制比二小则为二进制。获得进制后直接计算十进制数字。
给定一个 N×M 的矩阵 A, 请你统计有多少个子矩阵 (最 小 1×1, 最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 KK ?
第一行包含三个整数 N,M 和 K,之后 N 行每行包含 M 个整数, 代表矩阵 A。
一个整数代表答案。
输入
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
1
2
3
4
输出
19
1
满足条件的子矩阵一共有 19 , 包含:
大小为 1×1 的有 10 个。
大小为 1×2 的有 3 个。
大小为 1×3 的有 2 个。
大小为 1×4 的有 1 个。
大小为 2×1 的有 3 个。
对于 30% 的数据, N,M≤20.
对于 70% 的数据, N,M≤100.
对于 100% 的数据, 1≤N,M≤500;0≤Aij≤1000;1≤K≤250000000
最大运行时间:1s
最大运行内存: 256M
先用二维前缀和存储矩阵信息,再用双指针来寻找正确答案。用i j分别表示一个区域的左右边界,p q来表示上下两个指针,p从上往下寻找q,一直到大小小于等于k,这 时p q这片区域的行数q - p + 1就是子矩阵的个数。
小明最近迷上了积木画, 有这么两种类型的积木, 分别为 II 型(大小为 2 个单位面积) 和 LL 型 (大小为 3 个单位面积):
同时, 小明有一块面积大小为 2×N 的画布, 画布由 2×N 个 1×1 区域构 成。小明需要用以上两种积木将画布拼满, 他想知道总共有多少种不同的方式? 积木可以任意旋转, 且画布的方向固定。
输入一个整数 N,表示画布大小。
输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取模后的值。
输入
3
1
输出
5
1
对于所有测试用例,1≤N≤10000000
dp 题目,一共有三种情况,我们把1设为上层不为空,2 设为下层不为空,3设成全不为空:
1:f[i][1],这种情况为 f[i] 的上层不为空,可以通过 f[i - 1] 下层不为空和 f[i - 2] 全不为空得来。
2:f[i][2],这种情况为 f[i] 的下层不为空,可以通过 f[i - 1] 上层不为空和 f[i - 2] 全不为空得来。
3:f[i][3],这种情况为 f[i] 的上下层不为空,可以通过 f[i - 1] 上层不为空和 f[i - 1] 全不为空和 f[i - 1]下层不为空和 f[i - 2] 全不为空得来。
最后输出 f[n] 全不为空就是答案
小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下, 在一个二维平面上放置着 n 个炸雷, 第 i 个炸雷 (xi,yi,ri) 表示在坐标(xi,yi) 处 存在一个 炸雷, 它的爆炸范围是以半径为 ri 的一个圆。
为了顺利通过这片土地, 需要玩家进行排雷。玩家可以发射 m 个排雷火 箭, 小明已经规划好了每个排雷火箭的发射方向, 第 j 个排雷火箭 (xj,yj,rj) 表 示这个排雷火箭将会在 (xj,yj) 处爆炸, 它的爆炸范围是以半径为 rj 的一个圆, 在其爆炸范围内的炸雷会被引爆。同时, 当 炸雷被引爆时, 在其爆炸范围内的 炸雷也会被引爆。现 在小明想知道他这次共引爆了几颗炸雷?
你可以把炸雷和排雷火箭都视为平面上的一个点。一个点处可以存在多个 炸雷和排雷火箭。当炸雷位于爆炸范围 的边界上时也会被引爆。
输入的第一行包含两个整数 n、m,接下来的 n 行, 每行三个整数 xi,yi,ri, 表示一个炸雷的信息。再接下来的 m 行, 每行三个整数 xj,yj,rj, 表示一个排雷火箭的信息。
输出一个整数表示答案。
输入
2 1
2 2 4
4 4 2
0 0 5
1
2
3
4
输出
2
1
示例图如下,排雷火箭 1 覆盖了炸雷 1,所以炸雷 1 被排除;炸雷 1 又覆盖了炸雷 2,所以炸雷 2 也被排除。
图片描述
评测用例规模与约定
对于 40 的评测用例: 0≤x,y≤109,0≤n,m≤103,1≤r≤10
对于 100 的评测用例: 0≤x,y≤109,0≤n,m≤5×104,1≤r≤10
最大运行时间:1s
最大运行内存: 256M
话说大诗人李白, 一生好饮。幸好他从不开车。
一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他 边走边唱:“无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。”
这一路上, 他一共遇到店 N 次, 遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。
请你计算李白这一路遇到店和花的顺序, 有多少种不同的可能?
注意: 显里没酒 ( 0 斗) 时遇店是合法的, 加倍后还是 没酒; 但是没酒时遇 花是不合法的。
第一行包含两个整数 N 和 M。
输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。
输入
5 10
1
输出
14
1
如果我们用 0 代表遇到花,1 代表遇到店,14 种顺序如下:
010101101000000
010110010010000
011000110010000
100010110010000
011001000110000
100011000110000
100100010110000
010110100000100
011001001000100
100011001000100
100100011000100
011010000010100
100100100010100
101000001010100
对于 40% 的评测用例: 1≤N,M≤10 。
对于 100%100% 的评测用例: 1≤N,M≤100 。
最大运行时间:1s
最大运行内存: 256M
动态规划,f[i][j][k] 表示在第 i 个位置,遇到第 j 个花,目前还剩 k 斗酒。
当遇到花时:f[i][j][k] =f[i - 1][j - 1][k + 1];
当遇到酒时:f[i][j][k] = (f[i][j][k] + f[i - 1][j][k / 2]) % mod;
这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一 开始第 i 棵竹子的 高度为 hi。
他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。魔法可以对连续的一段相同高度的竹子使用,假设这一段竹子的高度为 H,那么用一次魔法可以把这一段竹子的高度都变为,其中 ⌊x⌋ 表示对 x 向下取整。小明想 知道他最少使用多少次魔法可让所有的竹子的高度都变为 1 。
第一行为一个正整数 nn, 表示竹子的棵数。
第二行共 nn 个空格分开的正整数 hihi, 表示每棵竹子 的高度。
一个整数表示答案。
输入
6
2 1 4 2 6 7
1
2
输出
5
1
其中一种方案:
21426214267
→214262→214222→211222→111222→111111
共需要 5 步完成
对于 20% 的数据, 保证 n≤1000,hi≤106。
对于 100% 的数据, 保证 n≤2×105,hi≤1018 。
(源码较长,点此跳过源码)
我的HOT博:
本次共计收集 191 篇博文笔记信息,平均阅读量 1518 。已生成 17 篇阅读量大于 3000 的笔记索引链接。数据采集于 2023-04-02 22:09:53 完成,用时 6 分 19.28 秒。
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
全栈领域优质创作者——寒佬(还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是学习的两大利器。
【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
靠谱程序员的好习惯
CSDN实用技巧博文: