草庐IT

【蓝桥系列】12道「暴力枚举」真题,夯实你的刷题基本功(暴力枚举模板)

小蓝刷题 2023-04-03 原文

  欢迎各位旅行者,游玩小蓝の蓝桥城!

全文目录🎐

🧭故事开端

📖第一幕 ·「数字型」

枚举数字-成绩统计⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

枚举数字-成绩分析⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

枚举数字-货物摆放⭐⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

📖第二幕 ·「字符型」

枚举字符-门牌制作⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

枚举字符-单词分析⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

枚举字符-最大乘积⭐⭐

🚀传送锚点 

 💡思路点拨

🍞代码详解 

📖第三幕 ·「日期型」

模拟日期-星期几⭐

🚀传送锚点 

 💡思路点拨

🍞代码详解 

模拟日期-含2天数⭐

🚀传送锚点 

 💡思路点拨

🍞代码详解 

模拟日期-回文日期⭐⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

📖第四幕 ·「地图型」

模拟地图-灌溉⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

模拟地图-扫雷⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

模拟地图-图像模糊⭐

🚀传送锚点

 💡思路点拨

🍞代码详解 

🧭故事尾声


🧭故事开端

开始刷题旅行前,小蓝先简单介绍一下景点吧~(≧∀≦)ゞ

难度系数:题目后边的星星代表难度,1星是必会的简单题,2星是拉开差距的中档题。

(小Tips:暴力枚举题型一般不考3星难题,小蓝就不列出来为难友友了~)

🚀传送锚点:点击即可传送到蓝桥云课OJ平台,在那里可以提交你的代码进行测试。

(小Tips:第一次进入是注册页面,登入后即可传送到对应题目~)

💡 思路点拨:是小蓝对解题思路的总体概述,相信聪明的你,一点就通!

(小Tips:建议小伙伴们先自己刷题,再看题解,这样记得更牢,效果更佳~)

🍞代码详解:这里搭配了精简的代码和详细的注释,色香味俱全!

你扑到这篇文章上📖,就像饥饿的人扑到了面包上🍞,祝吃饱~


📖第一幕 ·「数字型」

枚举数字-成绩统计⭐

🚀传送锚点

 💡思路点拨

先来一道去年的枚举真题上上手~

1、输入:建立变量n,存储输入的考试人数n,再创建列表a,存储输入的考试分数。

                再创建列表b和c,存储及格人数和优秀人数。

2、计算:按照公式进行计算,及格率=及格人数➗总人数。

3、输出:格式化输出  Python format 格式化函数 | 菜鸟教程

🍞代码详解 

#枚举数字-成绩统计
n=int(input())                         #考试人数
a=[int(input()) for i in range(n)]     #学生得分
b=[i for i in a if i>=60]              #及格率
c=[i for i in a if i>=85]              #优秀率 
print("{:.0f}%".format(len(b)/n*100))  #71%
print("{:.0f}%".format(len(c)/n*100))  #43%

'''
测试样例:
a=[80, 92, 56, 74, 88, 100, 0]
b=[80, 92, 74, 88, 100]
c=[92, 88, 100]

函数解析:
len(b)/n:求平均值
*100:因为后面加了%,所以前面先乘100  0.71→71
"{x}%".format(x):格式化输出 x是变量, %是常量
{:.0f}:保留0位小数 71.428→71  42.857→43
'''

枚举数字-成绩分析⭐

🚀传送锚点

 💡思路点拨

1、输入:建立变量n,存储输入的考试人数n,再创建列表a,存储输入的考试分数。

2、计算:利用python的3个函数轻松计算:max() , min() , sum()

3、输出:跟上题一样format格式化输出,这次是保留2位小数哦~

🍞代码详解 

#枚举数字-成绩分析
n=int(input())
a=[int(input()) for _ in range(n)]
print(max(a))                  
print(min(a))
print("{:.2f}".format(sum(a)/n))

'''
测试样例:
   a=[80, 92, 56, 74, 88, 99, 10]
最大值:                   99
最小值:                       10
平均值:71.29

函数解析:
"{x}%".format(x):格式化输出 x是变量, %是常量
{:.2f}   :保留2位小数 71.2857->71.29
'''

枚举数字-货物摆放⭐⭐

🚀传送锚点

 💡思路点拨

1、约数:先输入一个n,再筛选n的约数,存到没有元素重复的集合d里。

2、遍历:三重循环模拟长宽高,遍历每一个约数,满足条件计数器+1.

🍞代码详解 

#枚举数字-货物摆放
n=2021041820210418               #货物数量
cnt=0                            #count统计值赋初始值0
d=set()                          #容器docker赋予集合属性
for i in range(1,int(n**0.5)+1): #循环遍历,筛选n的约数(对n开根号可加快速度)
    if n%i==0:                   #如果可被整除,判断为约数
        d.add(i)                 #添加约数
        d.add(n//i)              #添加相对应的另一个约数
for i in d:                      #三重循环遍历容器docker里的每一个约数
    for j in d:                  
        for k in d:
            if i*j*k==n:         #满足条件
                cnt+=1           #方案数+1
print(cnt)                       #提交时直接打印即可print(2430)

📖第二幕 ·「字符型」

枚举字符-门牌制作⭐

🚀传送锚点

 💡思路点拨

炒鸡简单的第一题,大家先来个开胃小菜~

1、遍历:遍历门牌编号1~2020,整数int转换成字符串str。

2、统计:count统计字符2的个数,计数器cnt+1。

🍞代码详解 

#枚举字符-门牌制作
cnt=0
for i in range(1,2021):
    cnt+=str(i).count("2")
print(cnt)#print(624)

枚举字符-单词分析⭐

🚀传送锚点

 💡思路点拨

1、输入:输入一个字符串,存在s里。

2、排序:注意有两次排序,按字典序排序,和单词出现的频率排序。

3、输出:打印字符串的第一个字符,调用count方法统计字符出现的次数。

🍞代码详解 

#枚举字符-单词分析
s=list(input())
ans=sorted(sorted(s),key=lambda x:s.count(x),reverse=True)[0]
print(ans)
print(s.count(ans))
'''
样例输入:
lanqiao

样例输出:
a
2

样例详解:
排序前:s=['l', 'a', 'n', 'q', 'i', 'a', 'o']
排序后:s=['a', 'a', 'i', 'l', 'n', 'o', 'q']
第一次sorted(s):按字典序从小到大升序排列↗(a->b->c)
第二次sorted(key=lambda x:s.count(x)):按字母出现的频率升序排列↗
reverse=True:表示从大到小降序排列↘(默认False升序排列)
[0]:出现最多的字母索引为s[0]:'a'
'''

枚举字符-最大乘积⭐⭐

🚀传送锚点 

984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要输出的是一个整数,表示那个最大的积,只输出乘积,不要输出整个算式。

 💡思路点拨

1、输入:创建列表a,存储符合条件的乘积。

2、枚举:先用全排列枚举1~9这9个数。

3、遍历:再套一层 j 循环给两个数分组。

4、判断:判断乘积是否符合题意?满足1~9这9个数,也就意味着没有0,没有重复。

5、输出:输出列表里符合条件的最大值。

🍞代码详解 

#枚举字符串-最大乘积
from itertools import permutations as per
a=[]
for i in per('123456789'):           #i=('1', '2', '3', '4', '5', '6', '7', '8', '9')
    i=''.join(i)                     #i='123456789'
    for j in range(1,9):             #1~8
        b=str(int(i[:j])*int(i[j:])) #b=1*23456789
        if len(set(b))==9 and '0' not in b:
            a.append(b)              #123456789
print(max(a))                        #839542176

'''
函数详解:
permutations:全排列函数
''.join(i):格式转换(字符列表->字符串)
len(set(b))==9:判断集合去重后是不是正好有9个数字
'0' not in b:9个数字中不包含0
为防止超时,提交时直接打印下面的代码
print(839542176) 
'''

📖第三幕 ·「日期型」

模拟日期-星期几⭐

🚀传送锚点 

 💡思路点拨

先来一道经典的模板题~用五步搞定90%的日期题。

1、导包:看到日期题,第一步导包:from datetime import *

2、输入:输入起始日a和终止日b。

3、遍历:遍历日期,以1天为单位。timedelta(1)

4、判断:满足条件国庆节,计数器+1。

5、输出:最后打印计数器的值就OK了 \^o^/

🍞代码详解 

#模拟日期-星期几
from datetime import *
a=date(1949,10,1)
b=date(2012,10,1)
cnt=0
while a<=b:
    if a.weekday()==6 and a.month==10 and a.day==1:
        cnt+=1
    a+=timedelta(1)
print(cnt)

'''
函数详解:
date(year,month,day):格式转换函数:数字格式→日期格式
a.weekday():星期几函数,默认从星期一开始(下标为0)
a.month: 日历月份
a.day:   日历天数
timedelta(1):1天(时间单位)
print(9)
'''

模拟日期-含2天数⭐

🚀传送锚点 

 💡思路点拨

还是跟上面一样的套路,走个5步,题就解完了。

1、导包:看到日期题,第一步导包:from datetime import *

2、输入:输入起始日a和终止日b。

3、遍历:遍历日期,以1天为单位。timedelta(1)

4、判断:如果年月日中有2,计数器就+1

5、输出:最后打印计数器的值就O了q(≧▽≦q)

小细节(从a遍历到b前一个,因为日历函数规定,日期不超过9999年12月31日)

🍞代码详解 

#模拟日期-含2天数
from datetime import *      #导入日期包
a=date(1900,1,1)            #开始日期
b=date(9999,12,31)          #结束日期
cnt=0                       #计数器
while a<b:                  #遍历日期
    if '2' in str(a):       #天数含2
        cnt+=1              #计数器+1
    a+=timedelta(1)         #下一天
print(cnt+1)                #print(1994240)

模拟日期-回文日期⭐⭐

🚀传送锚点

 💡思路点拨

第一种回文日期

1、输入:先将整数转换成日期格式 int -> date。

2、遍历:再遍历日期范围 a<=b 。

3、判断:日期格式转换为字符串,通过字符串逆序 [::-1] 操作,判断是否是回文数。

4、输出:输出第一种回文日期,打个标记 flag=1,下次不输出。

第二种回文日期

1、遍历:继续遍历,寻找第二种回文日期。

2、判断:用字符串切片 [] 操作,判断是否是满足条件的回文数。

3、输出:找到后输出第二种回文日期,break 结束循环。

🍞代码详解 

#模拟日期-回文日期
from datetime import *         
n=input()                                           #"20200202"
a=date(int(n[0:4]),int(n[4:6]),int(n[6:]))          #2020-02-02 00:00:00
b=date(9999,12,31)                                  #9999-12-31 00:00:00
flag=0                                              #标记是否输出了一次回文数
while a<=b:                                         #遍历日期范围
    a+=timedelta(1)                                 #从当前数+1开始遍历
    date=str(a).replace("-","")[:8]                 #日期格式->为字符串"20200202"
    if date==date[::-1]:                            #[::-1]:字符串逆序
        if flag==0:                                 #没输出过回文数
            print(date)                             #输出第一种回文日期:20211202
            flag=1                                  #做标记下次遇到回文数不打印
        if date[0]==date[-1]==date[2]==date[-3] and date[1]==date[-2]==date[3]==date[-4]:
            print(date)                             #输出第二种回文日期:21211212
            break                                   #跳出循环   

📖第四幕 ·「地图型」

模拟地图-灌溉⭐

🚀传送锚点

 💡思路点拨

小蓝总结了一下,地图题主要就是3步走🚶:输入→遍历→输出

1、输入:先输入题目里的一堆参数,用二维列表a模拟方格地图,初始化灌溉好的方格。

2、遍历:遍历每一个方格,如何判断方格的上下左右位置合法,进行灌溉(0赋值为1)

3、输出:统计地图里灌溉好的方格数(1的数量)。

🍞代码详解 

#模拟地图-灌溉
#输入
n,m=map(int,input().split())    #3行6列
t=int(input())                  #2个出水口
a=[[0]*(m) for _ in range(n)]   #初始的方格
b=[[0]*(m) for _ in range(n)]   #灌溉后的方格
for i in range(t):
    r,c=map(int,input().split())
    a[r-1][c-1]=1               #初始化出水口
k=int(input())
#遍历
for _ in range(k,0,-1):         #一分钟灌溉一次
    for i in range(n):
      for j in range(m):  
        if a[i][j]==1:
            b[i][j]=1           #中心值标记
            if i-1>=0:          #合格范围标记四个方向的水管
                b[i-1][j]=1
            if i+1<n:
                b[i+1][j]=1
            if j-1>=0:
                b[i][j-1]=1
            if j+1<m:
                b[i][j+1]=1
    a=b                         #灌溉完毕递归下一次
#输出
cnt=0
for i in b:
    for j in i:
        cnt+=j
print(cnt)                      #9个方格被灌溉
'''
样例输入:
3 6
2
2 2
3 4
1

样例输入:
9

样例详解:
0代表没灌溉,1代表已灌溉
a=[[0, 0, 0, 0, 0, 0],
   [0, 1, 0, 0, 0, 0],
   [0, 0, 0, 1, 0, 0]]
   
b=[[0, 1, 0, 0, 0, 0],
   [1, 1, 1, 1, 0, 0],
   [0, 1, 1, 1, 1, 0]]
'''

模拟地图-扫雷⭐

🚀传送锚点

 💡思路点拨

1、输入:老规矩,输入题目的一堆参数,创建两个地图(二维列表)代表扫雷前和扫雷后。

2、遍历:遍历每个坐标,有地雷标记为9,没地雷遍历八宫格范围内是否有地雷。

3、输出:把扫雷后的新地图,格式化打表一遍。

🍞代码详解 

#模拟地图-扫雷
#输入
n,m=map(int,input().split())                #3行4列
a=[list(map(int,input().split())) for _ in range(n)]
b=[[0]*m for _ in range(n)]                 #新地图                                 
#遍历
for i in range(n):
    for j in range(m):
        if a[i][j]==1:                      #存在地雷
            b[i][j]=9                       #标记地雷
        else:                               #遍历八宫格
            for k in range(i-1,i+2):        #i-1~i+1
                for h in range(j-1,j+2):    #j-1~j+1
                    if 0<=k<n and 0<=h<m:   #在合法范围内
                        if a[k][h]==1:      #有地雷的话
                            b[i][j]+=1      #地雷数量+1   
#输出
for i in range(n):
    for j in range(m):
        print(b[i][j],end=" ")
    print()

'''
样例输入:
3 4
0 1 0 0
1 0 1 0
0 0 1 0

样例输出:
2 9 2 1
9 4 9 2
1 3 9 2
'''

模拟地图-图像模糊⭐

🚀传送锚点

 💡思路点拨

上一道题的进阶版,换汤不换药~套地图模板就行~

1、输入:先输入题目的一堆参数,再创建两张图片(二维列表)代表图像处理前后。

2、遍历:遍历每个坐标,正常范围内是九宫格数字求和除以个数。

3、输出:把图像处理后的新图片(二维列表),格式化打表一遍。

🍞代码详解 

#模拟地图-图像模糊
#输入
n,m=map(int,input().split())    # 3 4
a=[list(map(int,input().split())) for _ in range(n)]
b=[[0]*m for i in range(n)]     #新地图
#遍历
for i in range(n):              #0 1 2
  for j in range(m):            # 0 1 2 3
    num,cnt=0,0                 #求和值和计数器
    for k in range(i-1,i+2):    #i-1~i+1 左右3个数字
      for h in range(j-1,j+2):  #j-1~j+1 上下3个数字
        if 0<=k<n and 0<=h<m:   #如果在正常索引范围内          
          num+=a[k][h]          #求和值累加
          cnt+=1                #计数器+1 
    b[i][j]=num//cnt            #灰度值赋值
#输出    
for i in range(n):
  for j in range(m):
    print(b[i][j],end=' ')
  print()
'''
样例输入:
3 4
0 0 0 255
0 0 255 0
0 30 255 255

样例输出:
0 42 85 127 
5 60 116 170 
7 90 132 191 
'''

🧭故事尾声

游玩的时光总是短暂,希望这段美好记忆,是夹在故事中那张书签🎐

喜欢小蓝的小伙伴记得点赞收藏不迷路(不点也行)

期待我们下一章「动态规划」再次遇见~

最后小蓝祝愿旅行者们好运连连🌟

一发出金,勇夺省一🥇

冲冲冲!

有关【蓝桥系列】12道「暴力枚举」真题,夯实你的刷题基本功(暴力枚举模板)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  5. ruby - 引用具有指定索引的枚举器值 - 2

    假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum

  6. ruby-on-rails - Ruby on Rails,使用同名枚举的问题 - 2

    以下是我认为的一些下拉列表:'form-control')%>和'form-control')%>这是我的application_helper.rbdefget_advance_bookingret=[{:require_booking=>'No'},{:require_booking=>'Yes'}]enddefget_instant_bookingret=[{:instant_booking=>'No'},{:instant_booking=>'Yes'}]end但现在的问题是,在我的模型product.rb中,我无法设置具有相同名称的枚举:classProduct我收到的错误是您

  7. ruby - 从结束值创建一系列字符串 - 2

    我使用irb。下面是我写的代码。“斧头”..“bc”我期待"ax""ay""az""ba"bb""bc"但结果只是“斧头”..“bc”我该如何纠正?谢谢。 最佳答案 >puts("ax".."bc").to_aaxayazbabbbc 关于ruby-从结束值创建一系列字符串,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7617092/

  8. ruby-on-rails - i18n 与枚举 gem - 2

    我正在使用Enumerizegemhttps://github.com/brainspec/enumerize/它允许我以简单的形式使用漂亮的选择。并且此选择中的所有选项均已翻译。en:enumerize:user:sex:male:'Man'female:'Woman'所以,在我的表单中,我选择了变体“男人”和“女人”。当我用“男人”值保存记录时,我得到了“男性”值的性别属性。现在我想在显示页面上将该值显示为“Man”,但是=@user.sex输出为'male'而不是'Man' 最佳答案 我可能会使用.text方法(您可以通过使用

  9. ruby-on-rails - Ruby:如何在 fixture 中配置枚举? - 2

    给定这个类:classUser我想创建一个如下所示的fixture:testuser1:id:1username:sampermission::permission_staff我尝试了多种语法变体,但没有找到有效的方法。结果user.permission为nil或0。我知道enum是最近添加的。这可以做到吗? 最佳答案 根据enumdocs你可以像这样通过类引用可枚举的:User.permissions[:permission_staff]工厂只是ruby​​代码——所以他们应该能够以相同的方式访问值testuser1:id:1us

  10. arrays - Ruby 可枚举 - 查找最多 n 次匹配元素 - 2

    我有以下数组:arr=[1,3,2,5,2,4,2,2,4,4,2,2,4,2,1,5]我想要一个包含前三个奇数元素的数组。我知道我可以做到:arr.select(&:odd?).take(3)但我想避免遍历整个数组,而是在找到第三个匹配项后返回。我想出了以下解决方案,我相信它可以满足我的要求:my_arr.each_with_object([])do|el,memo|memo但是有没有更简单/惯用的方法来做到这一点? 最佳答案 使用lazyenumerator与Enumerable#lazy:arr.lazy.select(&:o

随机推荐