【蓝桥杯Python专项|第十三届蓝桥杯大赛软件组省赛Python大学A组不完全题解】上次蓝桥杯省一国三二轮游,这次嘛,不光心心念念的北京也没了,而且这届体验明显没有上届好。。
刚考完试,来发一下自己的代码和解法,B、D、I是完全不会,H题不确定。
只能说。。。这届蓝桥杯好无语
我线上考的,我**打开个文件夹解压缩试题都算我两次 ”跳出当前界面“,
腾讯会议里“老师,我跳出次数太多被黄牌警告了”的声音此起彼伏
嗨!您猜怎么着!
老师说,黄牌都不用管,咱不看拉!
什么东西!(小声)(唯唯诺诺)
文章图片
文章图片
#403
#第一道题,找规律即可
#无论如何,要先切四刀,把纸上下左右切下来
#然后,切成若干个小条,每个小条若干刀
#比如 2 * 3
#就是 4 + (2-1) * (3-1) = 4 + 2 = 6
#就是,先切成22个小条,每个小条19刀,上下左右先切四刀
#所以答案是4 + (21) * (20)
文章图片
#不会
#我完全没有尝试的欲望和冲动
文章图片
#这道题和最后一道题会用到
#水题,不说了
#去重思路就是字典
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))
文章图片
文章图片
#一共就三种,4,6,8
#就三个块
#但是!我不会!
文章图片
文章图片
#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)
文章图片
文章图片
#给定一个数组 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)
文章图片
文章图片
#反正就是,找个规律嘛
#(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 ansdef 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)) % 998244353biao = [1,9,72,600,5400,52920,564480,6531840,8164800]#我是先用iterstools打表才找到的规律。。。n = int(input())
print(get_value(n))
文章图片
文章图片
#这道题我想的好麻烦,也不一定对。
#我设置了三个数组,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))
文章图片
文章图片
不会
文章图片
文章图片
#能表示成那个形式,就两个条件
#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 dicn = 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")
推荐阅读
- 蓝桥杯|2021年第十二届蓝桥杯大赛省赛python大学组真题加解析(更新中)
- 蓝桥杯|第八届蓝桥杯大赛试题及题解
- 蓝桥杯|2021年第十二届蓝桥杯省赛Python组(真题+解析+代码)(货物摆放)
- 蓝桥杯|蓝桥杯大赛 青少年创意编程 第十二届 C++组
- 蓝桥杯|蓝桥杯——阶乘计算
- 蓝桥杯|蓝桥杯 试题 基础练习 杨辉三角形
- Python算法|Python算法学习: 蓝桥杯官方练习系统VIP题库真题代码讲解(持续更新)
- 算法|2020年10月份蓝桥杯省赛B组C++题解
- 蓝桥杯|2019蓝桥杯省赛C++A组真题解析