经过二十天的准备,蓝桥杯拿到了Python研究生组省二,也算是一个还可以的结果了。
今年由于疫情,我这边改成了线上比赛,题型也变了,由原来的五个填空+五个编程,改成了两个填空+八个编程。
也是到了邻近比赛前两天才知道,不过也没啥影响。
这里先写一点经验吧,准备参加Python组的小伙伴一定要注意,时间复杂度,时间复杂度,时间复杂度,Python这个语言比C语言、java要慢很多,也就是说相同的算法,Python跑出来所需要的时间比它们都多,就会很容易出现超时的现象,一般这些题给出的数值的范围都会很大,如果不考虑时间复杂度的问题,那么一定会有2-8个样例通过不了,这就很惨了呀。
一个题看了两遍还是没有思路,就可以跳过看下面的了,不要过度耽误时间,下面的题有可能更简单。
我觉得主要是解决问题的逻辑吧,平时练题的时候着重了解解题思路,还有时间复杂度。如果不是有特别高的要求,就是拿个省一呀、国奖呀这种,我觉得平时不用刷特别难的题,看一些一般的题就够了,省二省三还是很简单的,省一往上就需要一定的功力了呀,大家按需来吧。
下面放一下我比赛的时候做的几个编程题吧
如果有错误欢迎大家指正。
首先是两个填空题,第一个填空题我已经忘了当时填的什么了,但是不难,通过找规律可以拿到结果。
第二个填空题就比较难搞了
看似给了很多条件,但是这个数的范围特别大,暴力无法得到结果,只能找到它更深的关系,降低算法的时间复杂度才能解决这个问题。我当时就是按照这些条件,找了一些简单的规律,写了一个暴力的程序,但是由于这个数的范围实在太大,等我下一题都想出来怎么做了,它还没跑出来,然后我就放弃了。
接下来是第一个编程题 质因数个数
我当时的答案是
def zhishu(b):
for i in range(2,b,1):
if b%i==0:
return 1
return 0
if __name__=='__main__':
n=int(input())
summ=0
a=0
k=(n//2)+1
for i in range(2,k,1):
if n%i==0:
a=int(n/i)
m=zhishu(i)
if a>i:
p=zhishu(a)
if p==0:
summ+=1
print(a)
if m==0:
summ+=1
print(i)
print(summ)
我做的第二个编程题是 消除游戏
我当时的答案是
def xiaochu(ls):
ls2=[0 for i in range(len(ls))]
for i in range(len(ls)):
ls2[i]=ls[i]
len1=len(ls)
for i in range(1,len1-1,1):
if ls[i]==ls[i-1] and ls[i]!=ls[i+1]:
ls2[i]='00'
ls2[i+1]='00'
elif ls[i]!=ls[i-1] and ls[i]==ls[i+1]:
ls2[i]='00'
ls2[i-1]='00'
a=ls2.count('00')
for i in range(0,a,1):
ls2.remove('00')
return ls2
if __name__=='__main__':
s=input()
ls=list(s)
n=2**256
for i in range(0,n,1):
ls1=xiaochu(ls)
#print(ls)
if len(ls1)==0:
ls=ls1
break
if len(ls1)==len(ls):
ls1=ls
break
ls=ls1
len2=len(ls)
if len2==0:
print('EMPTY')
else:
print("".join(ls))
我做的第三个编程题是 技能升级
我当时的答案是
def shengji(arr,n,summ):
maxx=0
manin=-1
for i in range(0,n,1):
if arr[i][0]>maxx:
maxx=arr[i][0]
maxin=i
if maxx>0:
summ+=maxx
arr[maxin][0]-=arr[maxin][1]
return summ
if __name__=='__main__':
n,m=input().split()
n=int(n)
m=int(m)
summ=0
arr=[[0 for i in range(2)]for j in range(n)]
for i in range(0,n,1):
arr[i]=[int(i) for i in input().split()]
arr[i][0]=int(arr[i][0])
arr[i][1]=int(arr[i][1])
for i in range(0,m,1):
summ=shengji(arr,n,summ)
print(summ)
我做的第四个编程题是 因数平方和
我当时的答案是
def yinshu(i):
fi=0
for j in range(1,i//2+2,1):
if i%j==0:
m=i//j
if m>=j:
if m!=j:
a=j**2+m**2
else:
a=j**2
fi+=a
return fi
if __name__=='__main__':
n=int(input())
gn=0
for i in range(1,n+1,1):
fi=yinshu(i)
print(fi)
gn+=fi
#print(gn)
da=gn%(10**9+7)
print(da)