当前位置:   article > 正文

【蓝桥杯考前七天】【十三届pythonB组真题详解】_13届蓝桥杯全排列的价值的python代码分析

13届蓝桥杯全排列的价值的python代码分析

前言

任其风华无限,难敌时间易老。
各位coder,一周后就要上考场验一验自己的代码水平了,从报名以来是否做到了每天两小时刷题?查找众多攻略是否真的把一个按顺序进行训练?
不知别人,小编没有,在今年的开放背景下,春季学期的前三周变成了考试周!结束后又想放松一下,加上学校的一些比赛和活动,真实刷题的时间寥寥,一开始肯定是简单的,因为肚子是空的,吃东西就好,但后面肚子渐渐变满,上顿的东西还没消化,下顿的又来了,过了一段时间消化不良的反应,终于重新回归!
最后一周让我们红尘作伴在此追逐一下最终的结果!
也不写7天规划了,每天找一套真题,干完就拉倒!
今天是第十三届蓝桥杯大赛软件赛省赛Python大学B组
总时间:4hours=240min
目标分数:50+!

A:排列字母

在这里插入图片描述

s="WHERETHEREISAWILLTHEREISAWAY"
c=[]
for i in s:
    c.append(i)
c.sort()
for i in c:
    print(i,end="")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这题还是很简单的,如果怕写错,就数一数和答案对一下
time:8min以内
value:+5分

B:寻找整数

在这里插入图片描述
这一看是不是先得把非质数去掉呀,把质数留下运算

import os
import sys
dp = [(2, 1), (3, 2), (5, 4), (7, 4), (13, 10), (19, 18), (23, 15), (29, 16), (31, 27), (37, 22), (41, 1), (47, 5)]//质数列表
lcm=187//最小公倍数
ans=187
i=0
while i<len(dp):
    if ans%dp[i][0]==dp[i][1]://满足条件
        lcm*=dp[i][0]//乘到lcm上
        i+=1//次数+1
    else:
        ans+=lcm//不满足就+lcm继续检验
print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

time+=30min
value+=5分
这题如果上来没想法建议直接跳过,5分写个半小时还是有点亏的,写不出来就更加亏了
看到网上还有个方法使用了中国剩余定理,看了半天没太懂,这题有点狗血

C:纸张尺寸

**题目描述**

l=1189
w=841
i=0
s=input()
n=int(s[-1])//把尺寸号截下来
for i in range(n)://长变宽,宽变长//2,次数就是尺寸号
  l,w=w,l//2
print(l)
print(w)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这题简单10分血赚!
time+=8
value+=10

D:数位排序

**题目描述**
这道题主要是排序,通过sort()的参数key,决定排序方法。
key=lambda x:sum(int(i) for i in str(x))
另一个比较常用的参数reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)

n=int(input())
m=int(input())
s=list(range(1,n+1))
s.sort(key=lambda x:sum(int(i) for i in str(x)))//重点内容记得背诵
print(s[m-1])
  • 1
  • 2
  • 3
  • 4
  • 5

time+=8min
value+=10分

E:蜂巢

**题目描述**
这道题六个方向不好写,改成平面坐标方便思考,因为每个点到中间的距离相同,所以使用如下距离方式,都是2**0.5
原点就是(0,0),0方向:(-2,0),1方向:(-1,1),2方向:(1,1),3方向:(2,0),4方向:(1,-1),5方向:(-1,-1)

import os
import sys
def walk(d,q,x,y)://从(x,y)向d方向走q步
  x+=x_dir[d]*q
  y+=y_dir[d]*q
  return x,y
x_dir=[-2,-1,1,2,1,-1]//方向表
y_dir=[0,1,1,0,-1,-1]
d1,p1,q1,d2,p2,q2=map(int,input().split())
x1,y1=walk(d1,p1,0,0)
x1,y1=walk((d1+2)%6,q1,x1,y1)
x2,y2=walk(d2,p2,0,0)
x2,y2=walk((d2+2)%6,q2,x2,y2)
dx,dy=abs(x1-x2),abs(y1-y2)//算差值用于判断行走距离
if dx>=dy://如果dx方向位移更大,我们只能先横着走,在竖着走,不能通过六边形优势快速到达,距离就是两者和的一半
  print((dx+dy)//2)
else://如果dy方向差值很大,我们发现斜着走就够了,因为每次在x方向有着60°的偏转,大家可以自己换图随便找几个例子试试
  print(dy)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

time+=20min
value+=15分
到此为止,如果以上5道题全部作对,那么拿个省二应该不成问题。
半期总结:这五道题中第二题难度最高,其他均可通过正常思考求解,预估时间两个小时以内,

F:消除游戏

**题目描述**
先读两遍题,看清要求是不相等的两个数为边界字符,所以样例一,经过两个判定条件,四个字母都为边界字符,全部删除为EMPTY
样例2:sdfhhhhcvhhxcxnnnnshh(加粗为删除字符)
第一轮过后先把在相同元素周围的字符删掉结果为=sdhhcnnh,第二轮就只剩s了

s=list(str(input()))
pre=s
f=False
for i in range(pow(2,64)):
    flag=[False]*len(s)
    for j in range(1,len(s)-1):
        if s[j]==s[j-1] and s[j]!=s[j+1]:
            flag[j]=True
            flag[j+1]=True
        if s[j]!=s[j-1] and s[j]==s[j+1]:
            flag[j-1]=True
            flag[j]=True
    for j in range(len(flag)):
        if flag[j]:
            s[j]=''
    s=list(''.join(s))
    if len(s)==0:
        f=True
        break
    if pre==s:
        break
    pre=s
if f:
    print('EMPTY')
else:
    print(''.join(s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

time+=30min
value+=15分
这题还是值得做的,写好判定条件,多编写几组样例测试。

G:全排列的价值


在这里插入图片描述
这题想不出来主打一个爆搜,但是你把内容写下来,你会发现,借用一个老哥的解释
在这里插入图片描述

a= int(input())
s= a*(a-1)/4
for i in range(1,a+1):
    s*=i
    s%=998244353
print(int(s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

中国人的脑袋还是好使得!
time+=15min
value+=15

H:技能升级

在这里插入图片描述

import math
n, m = list(map(int, input().split()))
mp = {}//字典进行存储
for i in range(0, n):
    Ai, Bi = list(map(int, input().split()))
    mp[i + 1] = [Ai, Bi, 0]
# print(mp)
temp = sorted(mp.items(), key=lambda mp: mp[1][0], reverse=True)//通过当前value进行排序
# print(temp)
res = 0
for i in range(0, m):
    index = temp[0][0]
    A = temp[0][1][0]
    B = temp[0][1][1]
    times = temp[0][1][2]
    # print(index,A,B,times)
    if times >= math.ceil(A / B)://如果当前此技能已经升到满级了,就置零
        A = 0
        B = 0
    res += A
    A -= B
    times += 1
    mp[index] = [A, B, times]//善后处理,重新排序
    temp = sorted(mp.items(), key=lambda mp: mp[1][0], reverse=True)
print(res)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述
debug视图
time+=30min
value+=20分

结语

最后两道题我就不写了,看了好久都没看懂,但如果前八道题,能AC5道以上,那么省二肯定是保底,省一就看你其他题的部分分拿的怎么样了,不管怎么说,这套题整体看来质量还是过关的
有三道送分的,全写对拿个奖保底没问题,数论、DP、贪婪算法,使用列表、字典、排序、二分,考察全面,质量过关!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/528682
推荐阅读
相关标签
  

闽ICP备14008679号