第一题 单位变换

题目

【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

1G=1024M

答案

15488

第二题 约数个数

题目

【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

枚举+检查

参考代码

# 1200000有多少个约数(只计算正约数)。
N = 1200000if __name__ == '__main__':print(len([i for i in range(1, N + 1) if N % i == 0]))
}

答案

96

第三题 叶结点数

题目

【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

n=n0+n1+n2,为使叶子节点数(n0)最多,必须n1最小,设为0,而n0=n2+1

得n2=(2019-1)/2=1009

所以n0=1010

答案

1010

第四题 数字9

题目

【问题描述】
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

伪代码

for i from 9  to 2019if str(i).contains('9')ans++

参考代码:

N = 2019
if __name__ == '__main__':ans = len([s for s in [str(i) for i in range(9, N + 1)] if '9' in s])print(ans)

答案

544

第五题 数位递增的数

题目

【问题描述】
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。

思路 O(kN)

迭代1~n转换为字符串迭代字符串的每一位,判断是否满足要求

参考代码

if __name__ == '__main__':ans = 0n = int(input())for s in [str(i) for i in range(1, n + 1)]:flag = Truefor j in range(1, len(s)):if s[j - 1] > s[j]:flag = Falsebreakif flag:ans += 1print(ans)

第六题 递增三元组

题目

【问题描述】
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

思路 O(N^2)

枚举每个元素该元素与前面的元素比较,找到小的即可该元素与后面的元素比较,找到大的即可上面两项为真,即说明当前元素可以作为三元组的中心

O(N^2),因为N最大为1000,所以1秒内可以解决战斗。

参考代码

if __name__ == '__main__':ans = 0n = int(input().strip())data = [int(x) for x in input().strip().split(' ')]  # 转整数列表len1 = len(data)for j in range(1, len1 - 1):hasSmall = FalsehasBig = Falsefor i in range(j):if data[i] < data[j]:hasSmall = Truebreakfor k in range(j + 1, len1):if data[j] < data[k]:hasBig = Truebreakif hasSmall and hasBig:ans += 1print(ans)

第七题 音节判断

题目

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。

解法

将单词的辅音标记为0,元音标记为1,那么符合要求的单词形态为0+ 1+ 0+ 1

在限定开头必须为0,最后必须为1的情况下,01交替为3次,即前后元素相加结果为1的次数必须为3

代码:

if __name__ == '__main__':word = input().strip()h = [int(c in 'aeiou') for c in word]# 首字母不能是元音  尾字母不能是辅音if h[0] == 1 or h[-1] == 0:print('no')exit()cnt = len([i for i in range(1, len(h)) if h[i - 1] + h[i] == 1])print('yes') if cnt == 3 else print('no')

正则表达式

if __name__ == '__main__':word = input().strip()import rematch = re.match('[^aeiou]+[aeiou]+[^aeiou]+[aeiou]+', word)print('no') if match == None or match.end() != len(word) else print('yes')

第八题 长草

题目

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g...
.....
..g..
.....
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

思路 O(N*M)

典型的bfs,基本是个模板题。时间复杂度最多为O(N*M)。

参考代码

class Block:i = 0j = 0month = 0def __init__(self, i, j, month):self.i = iself.j = jself.month = monthdx = (-1, 1, 0, 0)
dy = (0, 0, -1, 1)
if __name__ == '__main__':(N, M) = (int(x) for x in input().strip().split(' '))data = [input() for _ in range(0, N)]  # 记录原始数据ans = [['.'] * M for _ in range(N)]  # 记录答案 # 全部初始化为.K = int(input().strip())  # 输入Kq = [Block(i, j, 0) for i in range(N) for j in range(M) if data[i][j] == 'g']  # bfs的原始队列# 模拟队列起始位置qBegin = 0# 队列操作while qBegin < len(q):x, y, month = q[qBegin].i, q[qBegin].j, q[qBegin].monthqBegin += 1ans[x][y] = 'g'  # 标记在结果中if month < K:for (nx, ny) in [(x + _x, y + _y) for (_x, _y) in zip(dx, dy)]:if 0 <= nx < N and 0 <= ny < M and ans[nx][ny] == '.':q.append(Block(nx, ny, month + 1))ans[nx][ny] = 'g'# 输出for i in range(N):print(''.join(ans[i]))

第九题 序列计数

题目

【问题描述】
小明想知道,满足以下条件的正整数序列的数量:
1. 第一项为 n;
2. 第二项不超过 n;
3. 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。

思路:记忆型递归 O(N^3)

题干第三点,是一个递归定义,可以得到递归式:

f(pre,cur) = f(cur,1) + f(cur,2) + ... +f(cur,abs(pre-cur)-1) + 1
pre表示前一个数,cur代表当前的数,选定之后,序列种数等于以cur为前序,以1到abs-1为当前的序列数的总和再加1.
如f(5,2) = f(2,1)+f(2,2).

但是暴力递归的复杂度是指数级

基本的优化方案是加状态记忆:但输入1000时,实测运行时间为1000~2000ms;

进一步优化

至此,能通过80%的数据(在1000ms限制下);

解空间是N的平方(详细为N*N)表格,但是每次都要循环加总,所以成了N的立方,在同样的解空间下,避免循环加总,即可优化到N的平方

重新考虑状态的转移:

如果我们用f(i,j)表示前一个数是i,当前数是1到j的合法序列的个数;有f(i,j) = 1 + f(i,j-1) + f(j,abs(i-j)-1)即分为两个部分1)i作为前一个数,从1到j-1为当前数的合法序列的个数已经计算好,2)求以j为尾数,后面选择1到abs(i-j)-1的合法序列的个数。

如 f(10,5)=f(10,4)+f(5,4);而不是枚举1到5;这样每次解答树只展开两个节点,相当于减少一层循环,虽然解答树的层次还是很深,但是由于记忆的存在,解空间仍然是N的平方。可在100ms内解决。

参考代码:

import sysMOD = 10000
mem = [[0] * 1001 for _ in range(1001)]sys.setrecursionlimit(2000)  # 设置递归层次限制def dfs(pre, cur):if cur <= 0:return 0if mem[pre][cur] != 0:return mem[pre][cur]mem[pre][cur] = (1 + dfs(pre, cur - 1) + dfs(cur, abs(pre - cur) - 1)) % MODreturn mem[pre][cur]if __name__ == '__main__':N = int(input().strip())print(dfs(N, N))

第十题 晚会节目单

题目

【问题描述】
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
小明发现,观众对于晚会的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
【输入格式】
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
第二行包含 n 个整数,依次为每个节目的好看值。
【输出格式】
输出一行包含 m 个整数,为选出的节目的好看值。
【样例输入】
5 3
3 1 2 5 4
【样例输出】
3 5 4
【样例说明】
选择了第1, 4, 5个节目。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n <= 20;
对于 60% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。

错误思路

如果用两次排序求解,那就错了。因为并不是要选出的方案的好看值总和最大,而是要从前往后尽量好看。即选出的M个数字典序最大

思路 O(N^2)

此题关键在于“第一个节目尽可能好看”并希望“第二个节目尽可能好看”……那么我们选择的第一节目就是max(g[0]~g[n-m])闭区间,要选择的第二个节目是max(g[lastMax+1],g[n-m+1])及从上一个节目往下到n-m+1这个区间里面选最好看的,直到剩下的必须全部选择。

算法用尺取法,双指针移动。理论上的复杂度是O(M*(N-M)),极端情况是M=N/2,整体达到(N^2)/2。如果输入数据为:

100000 50000
100000 99999 ...

实测运行时间为:10秒以上

参考代码

if __name__ == '__main__':(N, M) = (int(x) for x in input().strip().split(' '))data = [int(x) for x in input().strip().split(' ')]pos_max, pos_1, pos_2 = 0, 0, N - Mwhile pos_1 < pos_2 < N:while pos_1 < pos_2 < N:pos_1 += 1pos_max = pos_1 if data[pos_1] > data[pos_max] else pos_maxprint(data[pos_max], end=' ')pos_1, pos_2, pos_max = pos_max + 1, pos_2 + 1, pos_max + 1while pos_2 != N:print(data[pos_2], end=' ')pos_2 += 1print()

优化:区间最值查询 O(NlogN)

while (pos_1 < pos_2)if (games[++pos_1] > games[pos_max])pos_max = pos_1;

这一段代码是区间内查询最大值,反复多次,且数据是静态的,所以选择ST做RMQ。

f[i][j]表示以 i 为起点,连续 2^j 个数中的最大值(的下标);

转移方程就是:f[i][j] = data[f[i][j-1]] >= data[f[i+pow_2(j-1)][j-1]]?f[i][j-1]:f[i+pow_2(j-1)][j-1]; 注:比较原始数据,记录下标

由于预处理是O(nlogn),M次查询是O(M),每次查询是O(1),所以整体复杂度为O(nlogn)。

下列代码实测运行时间100ms以内

参考代码

MAX_N = 100010
MAX_POW = 20
N, M = 0, 0
st = [[0] * MAX_POW for _ in range(MAX_N)]
log = [0 for _ in range(MAX_N)]def initLog():log[1] = 0for i in range(2, N + 1):log[i] = log[i // 2] + 1def pow_2(x):return 1 << x# NlogN
def initSt(data):for i in range(N):st[i][0] = ifor j in range(1, log[N]):for i in range(N - pow_2(j - 1)):index1, index2 = st[i][j - 1], st[i + pow_2(j - 1)][j - 1]st[i][j] = index1 if data[index1] >= data[index2] else index2def query(data, l, r):len = r - l + 1k = log[len]index1, index2 = st[l][k], st[r - pow_2(k) + 1][k]return index1 if data[index1] >= data[index2] else index2if __name__ == '__main__':(N, M) = (int(x) for x in input().strip().split(' '))data = [int(x) for x in input().strip().split(' ')]initLog()initSt(data)pos_max, pos_1, pos_2 = 0, 0, N - Mwhile pos_1 < pos_2 < N:pos_max = query(data, pos_1, pos_2) #logNprint(data[pos_max], end=' ')pos_1, pos_2 = pos_max + 1, pos_2 + 1while pos_2 != N:print(data[pos_2], end=' ')pos_2 += 1print()

2020年蓝桥杯模拟赛解题报告(Python真香)相关推荐

  1. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  2. 第九届(2018)蓝桥杯 山东省赛解题报告(题目+分析+代码)

    1标题:第几天 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. [答案]:125 2标题:明码 汉字的字形 ...

  3. 竞赛——【蓝桥杯】2022年11月第十四届蓝桥杯模拟赛第一期Python

    1.二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数. 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数. 请问十 ...

  4. 【蓝桥杯Web】大一小白参与蓝桥杯模拟赛二期web组体会

    目录 前言 一.相关比赛介绍 1.ACM国际大学生程序设计竞赛 2.蓝桥杯 3.GPLT团队程序设计天梯赛 4.leetcode周赛和双周赛 5.PAT 二.蓝桥杯 1.应该参加蓝桥杯吗? 2.如何进 ...

  5. 第十三届蓝桥杯模拟赛第二期JAVA组个人题解

    第十三届蓝桥杯模拟赛第二期JAVA组个人题解 文章目录 第十三届蓝桥杯模拟赛第二期JAVA组个人题解 题目1 题目2 题目3 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目1 小蓝的I ...

  6. 蓝桥杯模拟赛第二场(web)

    文章目录 蓝桥杯模拟赛第二场(web) 1 卡片化标签页 2 随机数生成器 3 个人博客 4 学生成绩统计 5 水果摆盘 6 给页面化个妆 7 小兔子爬楼梯 8 时间管理大师 9 购物车 10 菜单树 ...

  7. 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++

    文章目录 第十三届蓝桥杯模拟赛(第三期)试题与题解 1.试题A 题解:数制转换 2.试题B 题解:枚举 3.试题C 题解:枚举 4.试题D 题解:最小生成树 5.试题E 方法一:暴力求和 方法二:一维 ...

  8. 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

    第十四届蓝桥杯模拟赛第一期 1. 二进制位数 问题描述 答案提交 参考答案 2. 晨跑 问题描述 答案提交 参考答案 3. 调和级数 问题描述 答案提交 参考答案 程序验证 4. 山谷 问题描述 答案 ...

  9. 2020十一届蓝桥杯国赛二等奖Java B组

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 参考博客https://blo ...

最新文章

  1. 今天是2013年06月21日,博客之路开始了!
  2. 【组队学习】【24期】零基础入门语音识别(食物声音识别)
  3. python如何解决高并发_Flask 处理高并发、多线程
  4. 实在不好意思,最近写个项目,一直没时间来灌水
  5. v-show与v-if的区别
  6. Cilium 首次集成国内云服务,阿里云 ENI 被纳入新版本特性
  7. 低通滤波和高通滤波的理解
  8. 中国塑溶胶密封剂行业市场供需与战略研究报告
  9. Cookie编码解码
  10. Async.js——Node世界中被依赖最多的库No.3
  11. python实现设计模式
  12. ubuntu zip文件解压失败
  13. 串口波特率自适应算法(仿真通过)
  14. 窄带物联网应用于工业计算机,工业物联网嵌入式边缘计算机的制作方法
  15. 2021年数字IC岗位职责及岗位要求
  16. OpenGL——顶点属性
  17. html大学生活主题,关于我的大学生活的主题班会策划
  18. java中英文字幕和_为了边看美剧边学英语,我写了个字幕处理脚本
  19. 一款高仿腾讯漫画的漫画阅读类 APP
  20. 宇视摄像机/硬盘录像机等设备接入到国标GB28181协议视频平台EasyGBS的注意事项

热门文章

  1. Cisco思科交换机 入门 - 查看DHCP 地址池
  2. 用python写一个简答的英文文章分析程序
  3. 【虫师Python】第二讲:元素定位
  4. echarts 地图迁徙 迁入迁出
  5. Python制作发票自动校核微信机器人
  6. Unity中暂停、继续播放、杀死、正放、倒放Dotween动画
  7. 使用内存安全工具提升应用质量和安全性
  8. UML快速入门 1 为什么要用UML建模-建模的重要性
  9. 数据分析学习的侧重点是什么?
  10. Java面试---自我介绍