蓝桥杯真题训练4

蓝桥杯真题训练

1-子串分值

对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中恰好出现一次的字符个数。例如 f(aba) = 1,f(abc) = 3, f(aaa) =0
f(aba)=1f(abc)=3,f(aaa)=0。现在给定一个字符串 S_{0 \cdots n − 1}S 0⋯n−1 (长度为 nn,1 \leq n \leq 10^51≤n≤10 5 ),请你计算对于所有 SS 的非空子串 S_{i \cdots j}(0 ≤ i ≤ j < n)S i⋯j (0≤i≤j<n),f(S_{i \cdots j})f(S i⋯j ) 的和是多少。

##代码一,贡献度计算公式:(左间隔+1)*(右间隔+1)
to = 0
n = input()
for i in range(len(n)):
    x = 0
    while(i-x>0):
        if(n[i-x-1]==n[i]):
            break
        x = x + 1
    c = 0
    while (i+c+1<len(n)):
        if (n[i+c+1] == n[i]):
            break
        c = c + 1
    to = to + (x+1)*(c+1)
print(to)

这个代码在官网的测试系统中是超时的,
于是我再网上继续寻找,在一个相关的题解下学到了小知识,解决了超时我超时问题。
学到的小知识:

list2=[-1 for i in range(num)]//可用作一定长度的初始值为-1list
##这个完全正确,没有超时,很完美
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')
    while (i+c+1<len(n)):
        if (n[i+c+1] == n[i]):
            break
        c = c + 1
    to = to + (i-li[index])*(c+1)
    li[index] = i
print(to)

解题思路:首先是贡献度计算公式的掌握,然后利用while找到右边间隔,利用list【index】,来记住上一次同样字符的位置,与i做差就是左间隔(其中list初始值都为-1,因为考虑到起始位置),最后贡献度计算公式得出的值相加即为答案。

2-承压计算

X 星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。 金属材料被严格地堆放成金字塔形。

                         7 
                        5 8 
                       7 8 8 
                      9 2 7 2 
                     8 1 4 9 1 
                    8 1 8 8 4 1 
                   7 9 6 1 4 5 4 
                  5 6 5 5 6 9 5 6 
                 5 5 4 7 9 3 5 5 1 
                7 5 7 9 7 4 7 3 3 1 
               4 6 4 5 5 8 8 3 2 4 3 
              1 1 3 3 1 6 6 5 5 4 4 2 
             9 9 9 2 1 9 1 9 2 9 5 7 9 
            4 3 3 7 7 9 3 6 1 3 8 8 3 7 
           3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
          8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
         8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
        2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
       7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
      9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
     5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
    6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
   2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
  7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
 1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 

7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
copy
其中的数字代表金属块的重量(计量单位较大)。 最下一层的 XX 代表 3030 台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上, 最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。

电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:20864582312086458231
请你推算出:读数最大的电子秤的示数为多少?

data=[[7],
[5,8],
[7,8,8],
[9,2,7,2],
[8,1,4,9,1],
[8,1,8,8,4,1],
[7,9,6,1,4,5,4],
[5,6,5,5,6,9,5,6],
[5,5,4,7,9,3,5,5,1],
[7,5,7,9,7,4,7,3,3,1],
[4,6,4,5,5,8,8,3,2,4,3],
[1,1,3,3,1,6,6,5,5,4,4,2],
[9,9,9,2,1,9,1,9,2,9,5,7,9],
[4,3,3,7,7,9,3,6,1,3,8,8,3,7],
[3,6,8,1,5,3,9,5,8,3,8,1,8,3,3],
[8,3,2,3,3,5,5,8,5,4,2,8,6,7,6,9],
[8,1,8,1,8,4,6,2,2,1,7,9,4,2,3,3,4],
[2,8,4,2,2,9,9,2,8,3,4,9,6,3,9,4,6,9],
[7,9,7,4,9,7,6,6,2,8,9,4,1,8,1,7,2,1,6],
[9,2,8,6,4,2,7,9,5,4,1,2,5,1,7,3,9,8,3,3],
[5,2,1,6,7,9,3,2,8,9,5,5,6,6,6,2,1,8,7,9,9],
[6,7,1,8,8,7,5,3,6,5,4,7,3,4,6,7,8,1,3,2,7,4],
[2,2,6,3,5,3,4,9,2,4,5,7,6,6,3,2,7,2,4,8,5,5,4],
[7,4,4,5,8,3,3,8,1,8,6,3,2,1,6,2,6,4,6,3,8,2,9,6],
[1,2,4,1,3,3,5,3,4,9,6,3,8,6,5,9,1,5,3,2,6,8,8,5,3],
[2,2,7,9,3,3,2,8,6,9,8,4,4,9,5,8,2,6,3,4,8,4,9,3,8,8],
[7,7,7,9,7,5,2,7,9,2,5,1,9,2,6,5,3,9,3,5,7,3,5,4,2,8,9,],
[7,7,6,6,8,7,5,5,8,2,4,7,7,4,7,2,6,9,2,1,8,2,9,8,5,7,3,6],
[5,9,4,5,5,7,5,5,6,3,5,3,9,5,8,9,5,4,1,2,6,1,4,3,5,3,2,4,1],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
for i in range(1,30):
  for j in range(i+1):
    if(j==0):  
      data[i][j]+=data[i-1][0]/2.0
    elif j==i:
      data[i][j] += data[i-1][j-1]/2.0
    else:
      data[i][j]+=data[i-1][j-1]/2.0+data[i-1][j]/2.0
print(int(2086458231/min(data[29])*max(data[29])))

解题思路:这题解是引用了LOU4041100113的代码。对于最后一行还有点不理解,为什么要除min,希望有缘人在评论区教导一下我。

3-质数

我们知道第一个质数是 22、第二个质数是 33、第三个质数是 55……

请你计算第 20192019 个质数是多少?

a = []
for i in range(20000):
  m = 0
  for j in range(1,i):
    if(i%j==0):
      m = m + 1
  if(m<=1):
    a.append(i)
print(a[2020])

解题思路:这种题就是暴力,然后我这个解有点垃圾,注意的是0 和 1都被包括进去了,所以输出a[2020]

4-跑步锻炼

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。

小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?

import datetime

start = datetime.date(2000, 1, 1)
end = datetime.date(2020, 10, 1)
days = datetime.timedelta(days=1)
ans = 0

while end >= start:
    if start.day == 1 or start.weekday() == 0:
        ans += 2
    else:
        ans += 1
    start += days
print(ans)

解题思路:引用风起云涌的代码,就是简单用datetime模块的函数,使用每日的跑步量相加。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值