蓝桥杯倒计时:刷题3.31

本文详细解析了蓝桥杯比赛前的刷题内容,涵盖二分算法、约数个数计算、寻找特定三位数、小明问题及螺旋矩阵和汉诺塔等算法题目,旨在提升参赛者的编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      

目录

1.打包(算法提高)二分

 2.约数个数(算法提高)

 3.寻找三位数(算法提高)

 4.第二点五个不高兴的小明

5.螺旋矩阵(模拟题)

5.汉诺塔


1.打包(算法提高)二分

def check(k):
     t=1
     summ=a[0]
     for i in range(1,n):
          if summ+a[i]<=k:
               summ+=a[i]
          else:
               t+=1
               summ=a[i]
     if t<=m:
          return True
     return False
n,m=map(int,input().split())
a=list(map(int,input().split()))
l=max(a)
r=sum(a)
while l<r:
     mid=(l+r)//2
     if check(mid):
          r=mid
     else:
          l=mid+1
print(r)

 2.约数个数(算法提高)

4/1=4 4/2=2 4/3=1 4/4=1 加起来是8

n=int(input())
sum=0
for i in range(1,n+1):
     sum+=n//i
print(sum)

 3.寻找三位数(算法提高)

from itertools import *
s=['1','2','3','4','5','6','7','8','9']
for x in permutations(s):
     p=''.join(x)
     a=p[0:3]
     b=p[3:6]
     c=p[6:9]
     a=int(a)
     b=int(b)
     c=int(c)
     if a*2==b and a*3==c:
          print(a,b,c)

 4.第二点五个不高兴的小明

n,p,t=map(int,input().split())
a=list(map(int,input().split()))
a.append(0)
dp=[[-float('inf') for i in range(1050)]for j in range(1050)]
for i in range(min(p,n)):
     dp[0][i]=a[i]
for i in range(1,t):
     for j in range(1,n+1):
          for k in range(1,p+1):
               if j-k>=0:
                    dp[i][j]=max(dp[i-1][j-k]+a[j],dp[i][j])
print(dp[t-1][n])

5.螺旋矩阵(模拟题)

dir=[(0,1),(1,0),(0,-1),(-1,0)]
x=0
y=0
d=0
a=[[0 for i in range(30)]for j in range(30)]
vis=[[0 for i in range(30)]for j in range(30)]
a[x][y]=1
vis[x][y]=1
for i in range(2,901):
     nx=x+dir[d][0]
     ny=y+dir[d][1]
     if  0<=nx<30 and 0<=ny<30 and vis[nx][ny]==0:
          vis[nx][ny]=1
          a[nx][ny]=i
          x=nx
          y=ny
     else:
          d=(d+1)%4
          nx=x+dir[d][0]
          ny=y+dir[d][1]
          a[nx][ny]=i
          vis[nx][ny]=1
          x=nx
          y=ny
print(a[19][19])

5.汉诺塔

a,b,c=map(int,input().split())
l=a+b+c
p=[0 for i in range(l+1)]
for i in range(1,4):
     a=list(map(int,input().split()))
     for j in a:
          p[j]=i
def hanoi(n,k):
     if n==0:
          return 0
     if p[n]==k:
          return hanoi(n-1,k)
     return hanoi(n-1,6-k-p[n])+2**(n-1)
print(hanoi(l,3))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值