2022蓝桥杯python笔记 题库

承重计算

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])))

相乘

for i in range(100000,100000000):
  if i*2021%1000000007==999999999:
    print(i)
    break

#print(17812964)

完全二叉树的权值

import math

n=int(input())
arr=[int(i) for i in input().split()]
deep=int(math.log(2,n)+1
ans=[]
for i in range(deep):
  ans.append(sum(arr[2**i-1:2**i*2-1])
print(ans.index(max(ans))+1)

时间显示

ms_in = int(input())
s_in = int(ms_in / 1000)  # 舍去ms部分转为秒
min_in = int(s_in / 60)
s = s_in % 60  # 秒部分
h_in = int(min_in / 60)
m = min_in % 60# 分部分
h = h_in % 24# 时部分
print("%02d:%02d:%02d" % (h, m, s))

等差素数列

对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除
print(2*3*5*7)

路径

from math import *
import sys
max=sys.maxsize
def lcm(x,y):
  return x*y//gcd(x,y)
dp=[max]*2022
dp[1]=0
for i in range(1,2022):
  for j in range(i+1,i+22):
    if j>2021:
      break
    lcmv=lcm(i,j)
    dp[j]=min(dp[j],dp[i]+lcmv)
print(dp[2021])

#10266837

跳跃

n,m=(int(x) for x in input().split())
map1=[]
for i in range(n):
    a=[int(x) for x in input().split()]
    map1.append(a)
dp=[[-100]*(m+3) for i in range(n+3)]

for i in range(3,n+3):
    for j in range(3,m+3):
        if i==3 and j==3:
            dp[i][j]=map1[i-3][j-3]
        else:
            dp[i][j]=map1[i-3][j-3]+max(dp[i-1][j],dp[i-2][j],dp[i-3][j],dp[i-1][j-1],
            dp[i-1][j-2],dp[i-2][j-1],dp[i-2][j-2],dp[i][j-1],dp[i][j-2],dp[i][j-3])

print(dp[-1][-1])

最大降雨量


不需要去管前面的,只需要第四周的时候达到当前的最大值就行
1 2 3 46 47 48 49 46 第七周
4 5 6 42 43 44 45 42 第六周
7 8 9 38 39 40 41 38 第五周
10 11 34 35 36 37 34 第四周
print(34)

回文日期

from datetime import *
mydate=input()
a=int(mydate[0:4])
b=int(mydate[4:6])
c=int(mydate[6:])
x=date(a,b,c)
flag=True
for i in range(99999999):
  x=x+timedelta(1)
  s=str(x).replace('-','')
  if s==s[::-1]:
    if flag:
      print(s)
      flag=False
    if s[0]==s[2]==s[-1]==s[-3] and s[1]==s[3]==s[-2]==s[-4]:
      print(s)
      break
  

跑步锻炼

from datetime import*
a=date(2000,1,1)
b=date(2020,10,1)
ans=0
while a<=b:
  if a.weekday()==0 or a.day==1:
      ans+=1
  ans+=1
  
  a+=timedelta(1)

print(ans)

2021省赛空间

print(256*1024*1024*8//32)

明明的随机数

import os
import sys

# hash表
n=int(input())
hashtable={}
ans=[]
for i in input().split():
  if int(i) not in hashtable:
    hashtable[int(i)]=i
    ans.append(int(i))
ans.sort()
m=len(ans)
print(m)
for i in range(m):
  print(ans[i],end=' ')
  
#集合
n=int(input())
arr=[int(i) for i in input().split()]
sset=set(arr)
arr1=list(arr)
arr1.sort()

 

#纯数
def pure(x):
    while x:
        if x%10 in [0,1,4,6,8,9]:
            return False
        x//=10                          #注意:整除是 //
    return True
 
#质数
def prime(x):
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
            return False
    return True
 
#纯质数
cnt=0
for i in range(1,20210606):
    if pure(i) and prime(i):            #注意:先判断纯数,再判断质数
        print(i)
        cnt+=1
print(cnt)                              #输出结果:1903

points=[[x,y] for x in range(20) for y in range(21)]
docker=set()
for i in points:
    x1,y1=i[0],i[1]
    for j in points:
        x2,y2=j[0],j[1]
        if x1==x2:#斜率不存在
            continue
        #斜率
        k=(y2-y1)/(x2-x1)
        #截距
        b=(x2*y1-x1*y2)/(x2-x1)
        if (k,b) not in docker:
            docker.add((k,b))
print(len(docker)+20)

from datetime import*
a=date(2000,1,1)
b=date(2020,10,1)
ans=0
while a<b:
    if a.weekday()==0 or a.day==1:
        ans+=2
    else:
        ans+=1
    a+=timedelta(1)
print(ans)

i=1
count=0
while True:
    count+=str(i).count("1")
    if count==2021:
        print(i)
        break
    i+=1

差分前缀和

树木上药

n,m=map(int,input().split())
dp=[0]*n

for i in range(m):
  l,r,cost=map(int,input().split())
  dp[l-1]+=cost
  dp[r]-=cost
for i in range(n):
  dp[i]+=dp[i-1]

print(sum(dp))

小明的彩灯

n,q=map(int,input().split())
a=list(map(int,input().split()))
dp=[0]*(n+1)
for i in range(q):
    l,r,x=map(int,input().split())
    dp[l-1]+=x
    dp[r]-=x
for i in range(1,n):
    dp[i]+=dp[i-1]
for i in range(n):
    print(max(dp[i]+a[i],0),end=" ")

#暴力
n, m=map(int,input().split())
arr=list(map(int,input().split()))
for i in range(m):
    l,r=map(int,input().split())
    print(sum(a[l-1:r]))
#线性DP
n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
dp=[0 for i in range(n+1)]
for i in range(1,n+1):
    dp[i]=dp[i-1]+a[i]
for i in range(m):
    l,r=map(int,input().split())
    print(dp[r]-dp[l-1])
print(dp)

from queue import PriorityQueue
n=int(input())
a=list(map(int,input().split()))
q=PriorityQueue
for i in a:
    q.put(i)
ans=0
while q.qsize()!=1:
    a=q.get()
    b=q.get()
    ans+=a+b
    q.put(a+b)
print(ans)

from datetime import *
a=data(1900,1,1)
b=data(9999,12,31)
ans=0
while a<b:
    if '2' in str(a):
        ans+=1
    a+=timedelta(1)
#从a遍历到b前一个,因为日历函数规定,日期不超过9999年12月31日
print(ans+1)

from datetime import *
a=data(1949,10,1)
b=data(2012,10,1)
ans=0
while(a<=b):
    #weekday下标从0开始,即星期一
    if a.weekday()==6 and a.month==10 and a.day==1:
        ans+=1
    a+=timedelta(1)
print(ans)

import itertools
a=[]
for i in itertools.permutations('123456789'):
    i=''.join(i)
    for j in range(1,9):
        b=str(int(i[:j])*int(i[j:]))
        if len(set(b))==9 and '0' not in b:
            a.append(b)
print(max(a))

s=list(input())
ans=sorted(sorted(s),key=lambda x:s.count(x),reverse=True)[0]
print(ans)
print(s.count(ans))

ans=0

for i in range(1,2021):
    ans+=str(i).count('2')
print(ans)


n=2021041820210418
ans=0
d=set()
for i in range(1,int(n**0.5)+1):
    if n%i==0:
        d.add(i)
        d.add(n/i)

for i in d:
    for j in d:
        for l in d:
            if i*j*l==n:
                ans+=1
print(ans)    

n=int(input())
sum=0
max=0
min=100
for i in range(n):
    temp=int(input())
    if temp>max:
        max=temp
    if temp<min:
        min=temp
    
    sum+=temp
print(max)
print(min)
print('{:.2f}'.format(sum/n))

n=int(input())
a=[int(input()) for i in range(n)]
print(max(a))
print(min(a))
print("{:.2f}".format(sum(a)/n))

n=int(input())
best=good=0
for i in range(n):
    temp=int(input())
    if temp>=85:
        best+=1
    elif  temp>=60:
        good+=1

print("{:.0f}%".format((best+good)/n*100))
print("{:.0f}%".format((best)/n*100))

ans=0
for i in range(1,1000):
    for j in range(i+1,1000):
        a=sorted(list(str(i)+str(j)))
        b=i*j
        c=sorted(list(str(b)))
        if a==c and len(set(a))==len(set(c))==4 and 1000<b<9999:
            ans+=1
print(ans)
            

import itertools

for i in itertools.permutations('1234567890'):
    s=''.join(i)
    a,b,c=int(s[0:4]),int(s[4:8]),int(s[8:])
    if (a-b)*c==900:
        if len(str(c))==2:
            #print('('+str(a)+'-'+str(b)+')*'+str(c)+'==900')
            print('(%d-%d)*%d==900'%(a,b,c))

time=int(input())
h=int(time/3600)
m=int((time%3600)/60)
s=int((time%3600)%60)
print(str(h)+":"+str(m)+":"+str(s))

求最小公倍数

def lcm(a,b):
    #最大公约数×最小公倍数=a×b
    s=a*b
    while b:
        a,b=b,a%b
    return int(s/a)

n=int(input())
if n>=1 and n<=200:
    s1=list(map(int,input().split()))
    s1.sort()
for i in range(len(s1)):
    #end=''输出不换行
    print(s1[i],end='')

a,b=map(int,input().split())
print(a+b)

n=int(input())
F1,F2=1,1
for i in range(3,n+1):
    F1,F2=F2%10007,(F1+F2)%10007
print(F2)

import math
r=int(input())
s=math.pi*r*r
print('%.7f'%f)

n=int(input())
ans=0.5*n*(n+1)
print(int(sum))

 

import math
ans={
    "0 0":0,
    "1 1":0,
    "2 2":0,
    "0 1":-1,
    "1 2":-1,
    "2 0":-1,
    "1 0":1,
    "2 1":1,
    "0 2":1,
}
inp=input()
print(ans.get(inp))

ord()是chr()的配对函数,返回对应的ASCII码值

s=input()
ans=0
for i in range(len(s)):
    for j in range(i+1,len(s)):
        ans+=abs(ord(s[i])-ord(s[j]))
print(ans)

deque结构可以看作是内置的list结构的加强版,提供了在两端插入和删除的操作。

import collections

#上下左右四个方位对应
x=[1,0,-1,0]
y=[0,1,0,-1]

#前驱节点
pre={(0,0):(0,0),(2020,11):(2020,14),(11,14):(11,14),(2000,2000):(2000,2000)}
ans=4
queue=collections.deque()
#
queue.append((0,0,0))
queue.append((2020,11,0))
queue.append((11,14,0))
queue.append((2000,2000,0))

while queue:
    #取单个节点
    t=queue.popleft()
    if t[2]==2020:
        print(ans)
        break
    else:
        for i in range(4):
            nextx,nexty=t[0]+x[i],t[1]+y[i]
            if (nextx,nexty) not in pre.keys():
                pre[(nextx,nexty)]=(t[0],t[1])
                queue.append((nextx,nexty,t[2]+1))
                ans+=1




如果使用循环,程序的的性能可能更高;如果使用递归,程序可能更容易理解。

猜你喜欢

转载自blog.csdn.net/m0_67105022/article/details/123718979