【蓝桥杯倒数20天】【Python B组】随机刷题

前言

废话不多说,上篇博客也规划明白了,直接开刷。

1、等差素数列

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:长度为 10 的等差素数列,其公差最小值是多少?
下面是暴力解法

import math
def sushu(x):
    for i in range(2,int(math.sqrt(x))+1)://判断是否是素数,在【2,根号x}范围内查找
        if x%i==0:
            return False
    return True
pd=True
for i in range(2,10000)://暴力就是得扩大范围
    if sushu(i) and pd==True:
        for k in range(1,500):
            a=[0]*10
            a[0]=i
            for j in range(9):
                if sushu(a[j]+k):
                    a[j+1]=a[j]+k
                else:
                    break
            if 0 not in a:
                pd=False//标志循环结束
                print(k)            

当然如果你之前上过奥数班的话,这题一眼出结果

2004年,格林和陶哲轩证明存在任意长的素数等差数列。2004年4月18日,两人宣布:他们证明了“存在任意长度的素数等差数列”,也就是说,对于任意值K,存在K个成等差级数的素数。例如 K=3,有素数序列3, 5, 7 (每两个差2)……K=10,有素数序列 199, 409, 619, 829, 1039, 1249, 1459, 1669, 1879, 2089 (每两个差210)。对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除。他们将长达50页的论文——《素数含有任意长度的等差数列》——张贴在当日的预印本网站上,并向《美国数学年鉴》(Annals of Mathematics)投稿。

对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除。 这句话的意思是,假设长度为10,公差就等于所有小于10的素数的积。本题答案也就是 2 * 3 * 5 * 7=210
由此可见少儿教育多么重要,如果你没有ac过,请让你的孩子未来有资格ac。

2、后缀表达式

在这里插入图片描述

N,M=map(int,input().split())
lst=list(map(int,input().split()))
b=sorted(lst)
if M!=0:
    res=b[-1]-b[0]
    for i in range(1,M+N+1-1):
        res+=abs(b[i])
else:
    res=0
    for i in range(M+N+1):
        res+=b[i]
print(res)

首先,后缀表达式可以表示成二叉树的形式。

本题的突破口是负号的变号特性,负号可以把正号变成负号,把负号变成正号。

因此虽然给了N个正号和M个负号,但其实可以凑出1到N+M个负号。

因此一定会减去一个数,而且因为第一个数前面没有符号,还要再加一个数。因此只要减去最小的数,再加上最大的数,剩下的数直接用绝对值进行求和即可。

3、九宫幻方

在这里插入图片描述

from itertools import permutations//使用枚举工具
m=[]//矩阵
s=[1,2,3,4,5,6,7,8,9]
for i in range(3)://分三次接收数据
    m.extend(map(int,input().split()))
ans=0
for p in permutations(s)://枚举数组的所有排列
    flag=True
    for i in range(9):
        if m[i]!=0://当找到符合的排列时,进行验证操作
            if m[i]!=p[i]: flag=False
    if flag==True and p[0]+p[1]+p[2]==p[3]+p[4]+p[5]==p[6]+p[7]+p[8]==p[0]+p[3]+p[6]==p[1]+p[4]+p[7]==p[2]+p[5]+p[8]==p[0]+p[4]+p[8]==p[2]+p[4]+p[6]==15:
        ans+=1
        if ans==1: res=p//保留第一个符合条件的矩阵
if ans==1://只有一个解说明符合条件,输出矩阵
    for i in range(3):
        print(' '.join(str(j) for j in res[3*i:3*i+3]))
else:
    print("Too Many")

4、

在这里插入图片描述

s=0
da='''string'''
a=da.split('\n')
for i in range(30):
  for j in range(50):
    for k in range(j,50):
      if ord(a[i][j])<ord(a[i][k])://右边
        s+=1
    for k in range(i,30):
      if ord(a[i][j])<ord(a[k][j])://下边
        s+=1
    for u in range(30):
      for v in range(50):
        if (u-i+v-j==0 and u!=i) or (u-i==v-j and u-i>0)://正反对角线
          if ord(a[i][j])<ord(a[u][v]):
            s+=1
print(s)

这题手算不显示,读好题目,暴力AC

5、跳跃

在这里插入图片描述

n,m=map(int,input().split())
dp=[[*map(int,input().split())] for _ in range(n)]
direct=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(2,0),(2,1),(3,0)]//每步可以走的范围
for x in range(n):
    for y in range(m):
        res=[]
        for dx,dy in direct://遍历每个点能走的位置
            lx=x-dx
            ly=y-dy
            if(lx>=0 and ly>=0 and lx<n and ly<m):
                res.append(dp[lx][ly])//加到可行走范围内
        dp[x][y]+=max(res) if len(res)!=0 else 0//通过max()算出这个位置最大的奖励值
print(dp[-1][-1])//此位置为原点最大奖励值

终于遇到一个动态规划,简单说你从原点向前思考,分支太多,但是你从终点倒推,就会看到一条康庄大道

6、饮料换购

在这里插入图片描述

n=eval(input())
s=n
while n>=3:
  n-=3
  n+=1
  s+=1
print(s)

花三瓶,赚一瓶,不用着急一步一步算

7、平行四边形面积

在这里插入图片描述

l=int(input())
h=int(input())
s=l*h
if type(l*h) is int:
  print(l*h)
else:
  print(f"{
      
      s:.1f}")

要记住print小数咋写

8、猜生日

在这里插入图片描述

res=[]
for y in range(1900,2013):
    for d in range(1,31):
        num=y*10000+6*100+d
        if num%2012==0 and num%3==0 and num%12==0:
            res.append(num)
            break
print(res)

一开始读题给我读蒙了,整除的意思是分别整除,暴力冲一下吧

结语

今天从下午开始写,到晚上9点整结束,刷了16道题,有一些肉眼能看出来的就不放在blog上面了,第一天确实还是有点疲惫,可能上午6道,下午6道,晚上6道效果更好一点,也要兼顾难度,比如5简单+1中等,困难的话我不建议现在刷,打卡第一天!
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_53415043/article/details/129650684