2022蓝桥杯 Python研究生组

经过二十天的准备,蓝桥杯拿到了Python研究生组省二,也算是一个还可以的结果了。
今年由于疫情,我这边改成了线上比赛,题型也变了,由原来的五个填空+五个编程,改成了两个填空+八个编程。
也是到了邻近比赛前两天才知道,不过也没啥影响。

这里先写一点经验吧,准备参加Python组的小伙伴一定要注意,时间复杂度,时间复杂度,时间复杂度,Python这个语言比C语言、java要慢很多,也就是说相同的算法,Python跑出来所需要的时间比它们都多,就会很容易出现超时的现象,一般这些题给出的数值的范围都会很大,如果不考虑时间复杂度的问题,那么一定会有2-8个样例通过不了,这就很惨了呀。

一个题看了两遍还是没有思路,就可以跳过看下面的了,不要过度耽误时间,下面的题有可能更简单。

我觉得主要是解决问题的逻辑吧,平时练题的时候着重了解解题思路,还有时间复杂度。如果不是有特别高的要求,就是拿个省一呀、国奖呀这种,我觉得平时不用刷特别难的题,看一些一般的题就够了,省二省三还是很简单的,省一往上就需要一定的功力了呀,大家按需来吧。

下面放一下我比赛的时候做的几个编程题吧
如果有错误欢迎大家指正。
首先是两个填空题,第一个填空题我已经忘了当时填的什么了,但是不难,通过找规律可以拿到结果。
第二个填空题就比较难搞了
2022蓝桥杯 Python研究生组_第1张图片
看似给了很多条件,但是这个数的范围特别大,暴力无法得到结果,只能找到它更深的关系,降低算法的时间复杂度才能解决这个问题。我当时就是按照这些条件,找了一些简单的规律,写了一个暴力的程序,但是由于这个数的范围实在太大,等我下一题都想出来怎么做了,它还没跑出来,然后我就放弃了。

接下来是第一个编程题 质因数个数
2022蓝桥杯 Python研究生组_第2张图片
我当时的答案是

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)

我做的第二个编程题是 消除游戏
2022蓝桥杯 Python研究生组_第3张图片
2022蓝桥杯 Python研究生组_第4张图片
我当时的答案是

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))

我做的第三个编程题是 技能升级
2022蓝桥杯 Python研究生组_第5张图片
在这里插入图片描述
我当时的答案是

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)

我做的第四个编程题是 因数平方和
2022蓝桥杯 Python研究生组_第6张图片
我当时的答案是

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)

你可能感兴趣的:(python,蓝桥杯,算法)