2019年第十届蓝桥杯真题python解答(更新中)

1. 后缀表达式

首先要了解什么是后缀表达式:

后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。

  由于后缀表达式的运算符在两个操作数的后面,那么计算机在解析后缀表达式的时候,只需要从左向右扫描,也就是只需要向前扫描,而不用回头扫描,遇到运算符就将运算符放在前面两个操作符的中间(这里先不考虑乘方类似的单目运算),一直运算到最右边的运算符,那么就得出运算结果了。

后缀表达式是为了方标计算机运算,也就是隐式的含有小括号的一种表达式。有了小括号和减号,我们就可以把加号变成减号,减号变成加号。

对于本题,n个加号,m个减号。

如果m=0,就对所有的数相加即可得到最终结果。

如果m>0,就把数分成三类:

数据全为正:就把最小的那个数减掉,其他剩余的数加上就是最后结果。

数据全为负:就把最大的那个数加上,其他剩下的数减掉(也就是加上绝对值),就是最后结果。

数据有负有正:最后结果就是所有数的绝对值相加。

代码:

n,m=map(int,input().split())
nums=list(map(int,input().split()))
nums.sort()
            
if m==0:
      result=sum(nums)
else:
      if nums[0]>0:
            result=sum(nums[1:len(nums)])-nums[0]
      elif nums[-1]<0:
            result=sum(nums[0:len(nums)-1])*(-1)+nums[-1]
      else:
            absnums=[abs(x) for x in nums]
            result=sum(absnums)

print(result)
            

2. 平方和

这个题就很简单,暴力求解。

代码:

r=0
for i in range(1,2020):
      for j in str(i):
            if j in ['2','0','1','9']:
                  r=r+i**2
                  break

print(r)

 答案:2658417853

3. 数列求值

 本题也很简单,暴力求解。

代码:

l=[1,1,1]
for i in range(20190321):
      mm=sum(l)%10000
      l[0]=l[1]
      l[1]=l[2]
      l[2]=mm

print(l[2])

答案:4659

4. 最大降雨量

 答案:34

 5. 迷宫

 6. RSA解密

7. 完全二叉树的权值

    

 注意:完全二叉树和满二叉树是不一样的,我先把完全二叉树通过补0变成满二叉树然后再进行计算。代码中的depth的根据输入的数N算出的完全二叉树的深度,mm使深度为depth的满二叉树所拥有的节点数。因此对于输入的权重列表(样例输入的第二行的数)需要增加mm-depth个0,才会变成满二叉树

代码:

import math
n=int(input())
num=list(map(int,input().split()))
haha=0
sumh=0
result=1
depth=int(math.log(n+1,2))+1
#print(depth)
mm=2**depth-1
#print(mm)
for i in range(mm-n):
      num.append(0)
 
#print(num)
for i in range(1,depth+1):
      for j in range(2**(i-1),2**i):
            sumh+=num[j-1]
      
      if sumh>haha:
            haha=sumh
            result=i
      sumh=0
print(result)

8. 外卖店优先级

 

(162条消息) 蓝桥杯——历届真题 外卖店优先级-python_Prescu的博客-CSDN博客

 代码:(超时)

#N是N家外卖店  M条信息  求T时刻位于优先级的
N,M,T=map(int,input().split())
temp=[[] for i in range(T+1)]
for i in range(M):
    a,b=map(int,input().split())
    temp[a].append(b)
#grade记录每时每刻外面店i的优先级以及是否在优先缓存中(0\1),与是否进行了-1(进行了就是1 没进行就是0)
grade=[[]for i in range(N+1)]
for i in range(1,N+1):
    grade[i].append(0)
    grade[i].append(0)
    grade[i].append(0)

for i in range(1,T+1):
    for n in range(1,N+1):
        grade[n][2] = 0
        if grade[n][0]>0:
            grade[n][0] -= 1
            grade[n][2]=1
            if grade[n][0]<=3 and grade[n][1]==1:    #出优先缓存
                grade[n][1]=0

    lenth=len(temp[i])
    for j in range(lenth):
        x=temp[i][j]
        if grade[x][2]==1:
            grade[x][0]+=3
            grade[x][2]=0
        else:
            grade[x][0]+=2
        if grade[x][0]>5 and grade[x][1]==0:
            grade[x][1]=1

result=0
for i in range(1,N+1):
    if grade[i][1]==1:
        result+=1
print(result)

9. 修改数组

 

 自己写的代码时间会超限,在网上借鉴的别人的:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值