第十三届蓝桥杯大赛软件组省赛Python大学A组不完全题解

博主分享了自己参加蓝桥杯竞赛的经历,指出本届比赛体验下降,遇到技术问题如文件操作受限制。文章列举了部分编程题目及其解法,涉及数组操作、排序、数学规律等算法,并探讨了如何优化数组查询和序列操作。此外,还讨论了数论问题,如质因数分解和特定数值表示的条件。
摘要由CSDN通过智能技术生成

上次蓝桥杯省一国三二轮游,这次嘛,不光心心念念的北京也没了,而且这届体验明显没有上届好。。
刚考完试,来发一下自己的代码和解法,B、D、I是完全不会,H题不确定。
只能说。。。这届蓝桥杯好无语
我线上考的,我**打开个文件夹解压缩试题都算我两次 ”跳出当前界面“,
腾讯会议里“老师,我跳出次数太多被黄牌警告了”的声音此起彼伏
嗨!您猜怎么着!
老师说,黄牌都不用管,咱不看拉!
什么东西!(小声)(唯唯诺诺)

第十三届蓝桥杯大赛软件赛省赛_PA_00

第十三届蓝桥杯大赛软件赛省赛_PA_01

#403
#第一道题,找规律即可
#无论如何,要先切四刀,把纸上下左右切下来
#然后,切成若干个小条,每个小条若干刀
#比如 2 * 3
#就是 4 + (2-1) * (3-1) = 4 + 2 = 6
#就是,先切成22个小条,每个小条19刀,上下左右先切四刀
#所以答案是4 + (21) * (20)

第十三届蓝桥杯大赛软件赛省赛_PA_02

#不会
#我完全没有尝试的欲望和冲动

第十三届蓝桥杯大赛软件赛省赛_PA_03

#这道题和最后一道题会用到
#水题,不说了
#去重思路就是字典
def num_y(n):
    i = 2
    dic = {}
    while i <= n:
        if n % i == 0:
            if i in dic:
                dic[i] += 1
            else:
                dic[i] = 1
            n /= i
            i = 1
        i += 1
    return dic
n = int(input())
print(len(num_y(n))

第十三届蓝桥杯大赛软件赛省赛_PA_04

第十三届蓝桥杯大赛软件赛省赛_PA_05

#一共就三种,4,6,8
#就三个块
#但是!我不会!

第十三届蓝桥杯大赛软件赛省赛_PA_06

第十三届蓝桥杯大赛软件赛省赛_PA_07

#2^64。。。
#10^6。。。。
#这基本就是跑死,跑到最后的意思
#用不着考虑2^64次操作啥的
#那就写个函数,先标记,然后再来个循环更改
#因为,对于abbccd
#如果直接操作,那就没了
#如果从前到后,那就是cd
s = input()
def dofun(s):
    flag = False
    ls = [False] * len(s)
    for i in range(len(s) - 2):
        if (s[i] == s[i+1] and s[i+1] != s[i+2]):
            ls[i+1] = True
            ls[i+2] = True
            flag = True
        if  (s[i] != s[i+1] and s[i+1] == s[i+2]):
            ls[i] = True
            ls[i+1] = True
            flag = True
    if s == "":
        print("EMPTY")
        return
    if(not flag):
        print(s)
        return
    next_s = ""
    for i in range(len(s)):
        if not ls[i]:
            next_s += s[i]
    dofun(next_s)

dofun(s)

第十三届蓝桥杯大赛软件赛省赛_PA_08

第十三届蓝桥杯大赛软件赛省赛_PA_09

#给定一个数组 A 和一些查询 Li, Ri,求数组中第 Li 至第 Ri 个元素之和。
#小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查
#询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可
#以增加多少?
#这个问题蛮简单的,两次排序。
#首先,排序查询次数
#然后排序数组
#相乘就是更改后的答案,减去之前的就行

"""
5
1 2 3 4 5
2
1 3
2 5
"""
n = int(input())
ls = list(map(int,input().split()))
sea_m = int(input())
sea_ls = [0] * len(ls)
ori_ans = 0
for i in range(sea_m):
    op,cl = map(int,input().split())
    for j in range(op-1,cl):
        ori_ans += ls[j]
        sea_ls[j] += 1
#拿到了数组,保存了查询次数。
#对查询次数进行排序,对原数组进行排序
#然后根据查询次数相乘
ls.sort()
sea_ls.sort()
ans = 0
for i in range(len(ls)):
    ans += ls[i] * sea_ls[i]
print(ans - ori_ans)

第十三届蓝桥杯大赛软件赛省赛_PA_10

第十三届蓝桥杯大赛软件赛省赛_PA_11

#反正就是,找个规律嘛
#(1,2,3):0+1 +2=3
#(1,3,2):0+1+1=2
#(2,1,3) :0+0+2=2
#(2,3,1):0+1+0=1
#(3,1,2):0+0+1=1
#(3,2,1):0+0+0=0
#可以看到,(1,2,3)的价值和(3,2,1)是互补的,他们的合等于最大排列的数值。
#所以,公式就简单了起来:全排列数目*最大排列数值
def velue(ls):
    ans = 0
    for i in range(len(ls)):
        for j in range(i):
            if ls[i] > ls[j]:
                ans += 1
    return ans


def get_value(n):
    ls = []
    ans = 1
    for i in range(1,n+1):
        ans *= i
        ans %= 998244353
        ls.append(i)
    return (int(ans/2 * (n-1) * (n) /2)) % 998244353

biao = [1,9,72,600,5400,52920,564480,6531840,8164800]#我是先用iterstools打表才找到的规律。。。

n = int(input())
print(get_value(n))

第十三届蓝桥杯大赛软件赛省赛_PA_12

第十三届蓝桥杯大赛软件赛省赛_PA_13

#这道题我想的好麻烦,也不一定对。
#我设置了三个数组,dp,dp_ans,dp_finl
#dp就是正常的子序列长度
#dp_ans是”接上“之后新增的长度
#dp_finl是用于比较的答案长度
def max_up_list(ls):
    global limit
    #如果我俩之间的距离小于等于给的数
    #我俩就可以接上,不光接上,还可以加上中间的值
    #K = 1
    #0 1 2 3 4 5

    #1 4 2 6 8 5
    #1 2 2 3 4 3
    #1 2 2 4 4 3
    #0 0 0 1 0 0
    #后面的数组也可以加我
    #也就是说,后面的数组加的是我和我的新增量
    #那么,dp_ans存储新增量
    #使用maxn_finl存储最大新增量
    #整条序列中,最终答案为:max(进行操作的新增量)+dp[i]
    dp = [1] * len(ls)
    dp_ans = [0] * len(ls)
    dp_fina = [0] * len(ls)
    for i in range(len(ls)):

        maxn = 0
        maxn_ans = 0
        maxn_finl = 0#

        for j in range(i):
            if ls[i] >= ls[j] and dp[j] > maxn:#dp数组更新
                maxn= dp[j]

            if ls[i-1] < ls[j] and ls[i] > ls[j] and i - j - 1 <= limit and dp[j] + i - j - 1 > maxn_ans:#当次操作的dp数组更新
                print(i,j)
                maxn_ans = dp[j] + i - j#本来是i-j-1,但是自己也是个长度。

            maxn_finl = max(maxn_finl, dp_ans[j])#更新标志物
        dp[i] += maxn
        if maxn_ans - maxn > 0:
            dp_ans[i] += (maxn_ans - dp[i])
        dp_fina[i] += (maxn_finl + dp[i] + dp_ans[i])
    return max(dp_fina)

length,limit = map(int,input().split())
ls = list(map(int,input().split()))
print(max_up_list(ls))

第十三届蓝桥杯大赛软件赛省赛_PA_14

第十三届蓝桥杯大赛软件赛省赛_PA_15

不会

第十三届蓝桥杯大赛软件赛省赛_PA_16

第十三届蓝桥杯大赛软件赛省赛_PA_17

#能表示成那个形式,就两个条件
#1,质因数小于等于两个
#2,非1质因数的幂大于等于二
#直接用第一道大题的函数
def num_y(n):
    i = 2
    dic = {}
    while i <= n:
        if n % i == 0:
            if i in dic:
                dic[i] += 1
            else:
                dic[i] = 1
            n /= i
            i = 1
        i += 1
    return dic

n = int(input())
for i in range(n):
    tmp = int(input())
    tmp_d = num_y(tmp)
    flag = True
    if len(tmp_d) > 2:
        flag = False
    else:
        for j in tmp_d:
            if tmp_d[j] < 2:
                flag = False
    if flag:
        print("yes")
    else:
        print("no")

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值