说明:在CSP认证的基础上(可以看看本人CSP打卡系列的博客)备赛2024蓝桥杯(Python),本人专业:大数据与数据科学 因此对python要求熟练掌握,通过练习蓝桥杯既能熟悉语法又能锻炼算法和思维逻辑,在此专栏中将记录本人每天的练习内容和解题思路。本人使用lanqiaoOJ练习,地址:www.lanqiao.cn/problems登录后即可根据题号查找到题目。题目部分将截图展示,题目分析讲述大致分析思路,题解中的代码注释详细解释步骤。如有不理解的部分或者值得改进的地方请在评论区留言。
学习计划:两道杂题,至少三道专项题。练习代码量不少于300行。
题目1
题目分析
1.显然 考察数组的知识,再看存储格式,直接用二维列表表示矩阵。
2.显然 运动轨迹是下右上左,限定运动次数即是矩阵中正整数的个数,判断轨迹方法:不可超过边界,遍历过的点不再遍历第二遍因此需要做标记。
3. 确定拐弯方向:由于只有四种方式且是循环执行所以,计数器从0开始计数,每过一步就加1对4取余即可判断拐弯方向。
4. 输出当前正整数,标准化输出后将走过的点标记即可。
题解
l=[]
m,n=map(int,input().split())
for i in range(m):
l.append(input().split())
dir=[[1,0],[0,1],[-1,0],[0,-1]]#下右上左
sum=m*n
x,y=-1,0
d=0#指针用来确定移动方向
while sum>0:
sum=sum-1
nx,ny=x+dir[d][0],y+dir[d][1]#确定下一个走的位置:xy是当前位置nx,ny是下一步的位置
if nx<0 or nx>=m or ny<0 or ny>=n or l[nx][ny]==-1:#需要换方向的情况,走过的标记为-1,输入的都是正正数所以不打架
d=(d+1)%4 #确定拐弯方向
x,y=x+dir[d][0],y+dir[d][1]#移动到下一个
else:#不需要换方向的时候
x,y=nx,ny
print(l[x][y],end=" ")#按标准空格分割
l[x][y]=-1#将走过的标记
题目二
区间修改、区间求和 lanqiaoOJ题号1133
【题目描述】
给定一个长度为n的数组,其初值分别为a1, a2, …, an。有m个操作,操作有两种:
1 l r k,将区间al+1, …, ar的值加上k。
2 l r,求区间al, al+1 ,…, ar的和是多少。
【输入描述】
输入第1行包含两个正整数n,m,分别表示数组a的长度和操作的个数。
第2行包含N 个非负整数a1,a2,…,an,表示数组a元素的初值。第3∼Q−2行每行表示一个操作,格式如题
【输出描述】
对每个求和输出1行,每行包含一个整数,表示相应查询的答案。
题目分析
- 分别将操作和原始数组存放在两个列表中。
- 遍历操作判断是1还是2 若1则需加k否则,2直接用内置函数sum求和。
- 成功的超时了。。。通过率只有30%
- 如若要满分需要用到树的内容,后期更新
30分题解
n ,q = list(map(int, input().split()))
a = [int(i) for i in input().split()]
for i in range(q):
s=list(map(int, input().split()))
#执行加k操作
l = s[1]-1
r = s[2]-1
if s[0]==1:
k = s[3]
for j in range(l,r+1):
a[j] += k
else:
print(sum(a[l:r+1]))
题目三
题号 1518但现在在OJ找不到
问题描述
有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。
输入格式
第一行一个整数n。
第二行一个整数x。表示第一辆自行车的编号。
以下n-1行,每行3个整数x,y,z。
z=0时,表示编号为x的自行车恰停放在编号为y的自行车的左边
z=1时,表示编号为x的自行车恰停放在编号为y的自行车的右边
输出格式
从左到右输出停车棚里的自行车编号
样例输入
4
3
1 3 1
2 1 0
5 2 1
样例输出
3 2 5 1
题目分析
- Python中的列表可以当做链表使用,也可以当做队列、栈、数组使用,需要熟练掌握其内置函数的所有用法,增删改查必不可少。
l=[]
l.index()#索引
l.insert()#插入
l.append()#追加
l.count()#计数
l.remove()#删除
l.pop()#移除并返回删除的值
l.sort()#排序
l.clear()#清空列表
l.copy()#复制
l.extend()#追加可迭代对象
l.reverse()#返转
- 常规输入,之后判断操作是插入的放右边还是左边,最后遍历存放好的列表即可。
题解
n=int(input())
x=input()
l=[]
l1=[x]
for i in range(n-1):
l.append(input().split())
for i in l:
#print(i)
if i[2]==1:
l1.insert(l1.index(i[1]),i[0])
else:
l1.insert(l1.index(i[1])+1,i[0])
for i in l1:
print(i,end=" ")
题解优化
n=int(input())
x=int(input())
l=[]
l1=[x]
for i in range(n-1):
x,y,z=map(int,input().split())
if z==0:#左边
l1.insert(l1.index(y),x)
else:#右边
l1.insert(l1.index(y)+1,x)
for i in l1:
print(i,end=" ")
题目四
题目分析
- 本题其实是练习数据结构中链表的操作,对于python来说使用列表可以方便的实现,这体现出python语言的方便。
- 多多练习列表方法即可很快实现,简单,不多赘述。
a=list(int(i) for i in range(1,11))#生成原始数组
b=[]#存放重排序之后的
n=int(input())
for i in range(n):
x=int(input())
index=a.index(x)
a.pop(index)
a.insert(0,x)
for j in a:
b.append(j)
sum=0#计数器
for i in b:
print(i,end=" ")
sum+=1
if sum%10==0:#每十个就换行输出
print(end="\n")#注意print()中参数的使用方法,等价于print("")
题目五
题解
n,k,m=map(int,(input().split()))
l=list(range(1,n+1))#人为1到10
i=k-1#位序从零开始所以减1
while len(l)>0:#只要有人没出来
i=(i+m-1)%len(l)#报数又是从1开始报数所以减一
print(l.pop(i))#人出去