蓝桥杯【第14届省赛】Python B组 1-3题

A题


count = 86419755
for i in range(12345678, 98765433):
    pp = str(i)

    for j in range(len(pp)):
        if pp[j] == '2':
            for q in range(j, len(pp)):

                if pp[q] == '0':
                    for t in range(q, len(pp)):
                        if pp[t] == '2':
                            for m in range(t, len(pp)):
                                if pp[m] == '3':
                                    count -= 1
                                else:
                                    continue
                        else:
                            continue
                else:
                    continue
        else:
             continue
print(count)

85774349 

lis=[0]*2024

for i in range(1,2024):
    if i%2==0:
        c=int(i//2)
        d=i
        for j in range(1,c+1):
            d+=j
        lis[i]=d
    if i%2!=0:
        pp=int((i-1)/2)
        d2=i
        for q in range(1,pp+1):
            d2+=q
        lis[i]=d2

print(max(lis))

513589

from itertools import combinations
lis=[]
s=input()
p=[]
for i in range(2,len(s)):
    nc = [''.join(i) for i in combinations(s, i)]
    lis += nc
   

for j in lis:
    for i in range(len(j)):
        p.append(s.index(j[i]))
    i=len(p)-1
    while i>1:
        if p[i]-p[i-1]>=2:
            i-=1
        else:
            lis.remove(j)
            break
        
    p=[]


for j in range(len(lis)):
    lis[j] = lis[j].replace('a', '1+')
    lis[j] = lis[j].replace('b', '2+')
    lis[j] = lis[j].replace('c', '3+')
    lis[j] = lis[j].replace('d', '4+')
    lis[j] = lis[j].replace('e', '5+')
    lis[j] = lis[j].replace('f', '6+')
    lis[j] = lis[j].replace('g', '7+')
    lis[j] = lis[j].replace('h', '8+')
    lis[j] = lis[j].replace('i', '9+')
    lis[j] = lis[j].replace('j', '10+')
    lis[j] = lis[j].replace('k', '11+')
    lis[j] = lis[j].replace('l', '12+')
    lis[j] = lis[j].replace('m', '13+')
    lis[j] = lis[j].replace('n', '14+')
    lis[j] = lis[j].replace('o', '15+')
    lis[j] = lis[j].replace('p', '16+')
    lis[j] = lis[j].replace('q', '17+')
    lis[j] = lis[j].replace('r', '18+')
    lis[j] = lis[j].replace('s', '19+')
    lis[j] = lis[j].replace('t', '20+')
    lis[j] = lis[j].replace('u', '21+')
    lis[j] = lis[j].replace('v', '22+')
    lis[j] = lis[j].replace('w', '23+')
    lis[j] = lis[j].replace('x', '24+')
    lis[j] = lis[j].replace('y', '25+')
    lis[j] = lis[j].replace('z', '26+')
    lis[j]+="0"
maxx=0
for j in range(len(lis)):
    c=eval(lis[j])
    maxx=max(c,maxx)
print(lis)
print(maxx)

......

修改:

1

count = 0
for i in range(12345678, 98765433):
    pp = str(i)
    has_2023 = False

    for j in range(len(pp)):
        if pp[j] == '2':
            for q in range(j+1, len(pp)):
                if pp[q] == '0':
                    for t in range(q+1, len(pp)):
                        if pp[t] == '2':
                            for m in range(t+1, len(pp)):
                                if pp[m] == '3':
                                    has_2023 = True
                                    break

    if not has_2023:
        count += 1

print(count)

##85959030

2.

第一种思路是,根据面值 2023 的硬币数最多,直接尽可能地兑换面值 2023 的旧硬币,总数为:2023 + \frac{(1+1011)\times1011}{2}=513589

上述方法在兑换时使用的最大面值为 r = 1011 (因为用 1011 和 1012 凑成 2023 时,数量取决于 1011,所以不考虑 1012),最优的凑法是凑成面值 2023 (= 1011 × 2 + 1) 的旧硬币

第二种思路是, 枚举用于兑换的新硬币最大面值 r \in [1012, 2023),并兑换面值为 tar = 2r + 1 的旧硬币,此时用于兑换的新硬币的最小面值为 l = tar - 2023

对于每一组 l,r,可以兑换面值为 tar 的旧硬币的个数为 \frac{(l+r)(r-l+1)}{2},不难推导出这是个关于 r 的二次函数,也就是其有极大值

枚举 r 并进行求解,最大值为:682425

# 创建一个结果集表示:两个硬币能兑换出的所有结果,共4046种
res = [0] * 4047

# 遍历范围从1到2023
for i in range(1, 2024):
    # 再次遍历范围从i+1到2023
    for j in range(i + 1, 2024):
        # 将'res'列表中索引为(i+j)的元素增加i, 因为兑换的次数取决于最小的硬币数,所以加i
        res[i + j] += i

# 找出'res'列表中的最大值并打印
c=res.index(max(res))
print(max(res),c)
#682425 2697

最大拼2697

我的代码,只判断了加起来小于等于2023的,其实可以是大于

3.

本题大概意旨是,不能选连续两个字符组成的序列,典型的打家劫舍板子

所以被包含的字符之间的空隔不超过 2

# 这题就是一个简单的dp
# 针对第i位的松散子序列 其最大价值要么是前i-2位的松散子序列加上自身价值
# 要么是i-1位松散子序列的最大价值
# 即  i位的松散子序列最大价值 = max(i-2位最大价值+自身字符价值, i-1位最大价值)
def subsequence(s):
    n = len(s)
    dp = [0 for _ in range(n + 1)]
    dp[1] = ord(s[0]) - 96  # 这里注意ASCII码要减96才是1-26的序列
    for i in range(2, n + 1):
        dp[i] = max(dp[i-2] + ord(s[i - 1]) - 96, dp[i-1])
    return dp[-1]
s = input()
print(subsequence(s))

一个松散子序列是指从原始字符串中选取的一组字符,这组字符之间的位置差至少为2,即任意相邻两个字符的位置索引差都大于等于2。例如,对于字符串 "abcde",其松散子序列可以是 "ace",因为每个字符之间的位置索引差都为2。而 "abe" 不是松散子序列,因为字符 'b' 和字符 'e' 的位置索引差为1,不满足条件。

换句话说,松散子序列是在原始字符串中选取的一组字符,这些字符在位置上不连续,其位置之间至少间隔一个字符。

ord() 函数  转换ASCII码

##开始没看懂题目

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是第十四蓝桥杯Python的部分内容: 一、选择(每5分,共40分) 1. 下列哪个不是Python的内置数据类型? A. int B. float C. char D. str 答案:C 2. 下列哪个不是Python的保留字? A. and B. or C. not D. xor 答案:D 3. 下列哪个不是Python的标准模块? A. os B. sys C. math D. timeit 答案:D 4. 下列哪个Python库可以用于科学计算? A. NumPy B. SciPy C. Matplotlib D. All of the above 答案:D 5. 下列哪个Python库可以用于机器学习? A. TensorFlow B. Keras C. PyTorch D. All of the above 答案:D 6. 下列哪个Python库可以用于爬虫? A. Requests B. BeautifulSoup C. Scrapy D. All of the above 答案:D 7. 下列哪个Python库可以用于图像处理? . OpenCV B. Pillow C. Scikit-image D. All of the above 答案:D 8. 下列哪个Python库可以用于游戏开发? A. Pygame B. Panda3D C. PyOpenGL . All of the above 答案:D 二、编程(每20分,共60分) 1. 编写一个Python程序,输入一个字符串,将其中的大写字母转换为小写字母,将其中的小写字母转换为大写字母,然后输出转换后的字符串。 2. 编写一个Python程序,输入一个整数n,输出n的阶乘。 3. 编写一个Python程序,输入一个字符串,判断该字符串是否为回文字符串。如果是回文字符串,则输出True,否则输出False。 以上是部分内容,完整的第十四蓝桥杯Python可以在蓝桥杯官网上找到。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值