蓝桥杯真题训练15

蓝桥杯真题训练

1-子串分值和

于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中出现的不同的字符个数。例如 f(“aba”) = 2,f(“abc”) = 3, f(“aaa”) = 1f(“aba”)=2,f(“abc”)=3,f(“aaa”)=1。

现在给定一个字符串 S [0…n − 1]S[0…n−1](长度为 nn),请你计算对于所有 SS 的非空子串 S [i…j](0 ≤ i ≤ j < n)Si…j,f(S [i…j])f(S[i…j]) 的和是多少。

li = [-1 for i in range(26)]
to = 0
index = 0
n = input()
for i in range(len(n)):
    c = 0
    index = ord(n[i]) - ord('a')
    to = to + (i-li[index])*(len(n)-i)
    li[index] = i
print(to)

解题思路:这题也是算单个字符的贡献度,不过与之前的问题不一样的是,这个算的是不同字符的个数相加,我们用公式的是,不是前一个相同的字符和后一个相同的字符,而是是整个字符串。但是会有与之前相同的字符重复的地方,所以仍然减去前一个间隔+1。

2-扫雷

在一个 nn 行 mm 列的方格图上有一些位置有地雷,另外一些位置为空。

请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。

n, m = map(int, input().split(" "))
a = []
for i in range(n):
    b = list(map(int, input().split(" ")))
    a.append(b)
c = [[0 for i in range(m)] for i in range(n)]
for i in range(n):
    for j in range(m):
        sum = 0
        if i-1>=0:
            if a[i-1][j] == 1:
                sum = sum +1
        if i+1<n:
            if a[i+1][j] == 1:
                sum = sum + 1
        if  i+1<n and j+1<m:
           if a[i+1][j+1]==1:
               sum = sum +1
        if i-1>=0 and j-1>=0:
            if a[i-1][j-1] == 1 :
                sum = sum +1
        if  j-1>=0:
            if a[i][j-1] == 1:
                sum = sum +1
        if j+1<m:
            if a[i][j+1] == 1:
                sum =sum +1
        if i+1<n and j-1>=0:
            if a[i+1][j-1] == 1:
                sum =sum +1
        if i-1>= 0 and j+1<m:
            if a[i-1][j+1] == 1:
                sum =sum +1
        if a[i][j] ==0:

           c[i][j] = sum
        else:
            c[i][j] = 9
for i in range(n):
    t=""
    for j in range(m):
      t =  t+ "{} ".format(c[i][j])
    print(t)
        

解题思路:暴力解法,找八个方向的地雷,累加得。

3-包子凑数

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼,其中第 ii 种蒸笼恰好能放 A_iA
i

个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买 XX 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有 XX 个包子。比如一共有 3 种蒸笼,分别能放 3、4 和 5 个包子。当顾客想买 11 个包子时,大叔就会选 2 笼 3 个的再加 1 笼 5 个的(也可能选出 1 笼 3 个的再加 2 笼 4 个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有 3 种蒸笼,分别能放 4、5 和 6 个包子。而顾客想买 7 个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的

import math
n = int(input())
s = []
g = 0
dp = [0 for i in range(10000)]
dp[0] = 1
for i in range(n):
    s.append(int(input()))
    if i == 0:
        g = s[i]
    else:
        g = math.gcd(s[i], g)  # 在输入的时候求出最大公约数
    for y in range(1, len(dp)):
             if y >= s[i] and dp[y - s[i]] == 1:
                    dp[y] = 1

if g == 1:
    print(dp.count(0))
else:
    print('INF')

解题思路:如果两个数的最大公约数不是1,那么这个两个数不能组成的数肯定有无限多个。最后可以利用动态规划的思想,求多个数的累积。参考文章:https://blog.csdn.net/bianxia123456/article/details/106032268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值