草庐IT

【蓝桥杯真题】18天Python组冲刺 心得总结

Py小郑 2023-04-08 原文

🌻蓝桥杯倒计时18天 小郑通过几道真题把自己的心得总结了一下

🌻再次感谢执梗、杨枝、Pluto.小怂、泡泡几位朋友的帮助

🌻希望对你们有帮助


1.蓝桥杯省赛:一步之遥(填空题)

本题有多种做法,这里利用BFS的方法解释一遍,分享一下我的BFS心得,毕竟蓝桥杯BFS还是很重要的。

单源最短路径型BFS必备的容器,函数:judge(),前驱结点字典pre,队列queue(其实就是列表),方向数组。下面解释各自的用法:

方向数组:根据题意设置,比如迷宫就需要设置两个方向数组dx和dy,如果是直线型运动的只需要一个方向数组,方向数组用于创建新结点

前驱结点pre:用字典来模拟 pre[i]=j,意思结点i的前驱结点是j(说土一点就是结点i前面那个结点是j),然后如果有小伙伴对结点这个东西不理解,【没关系,我举个例子,比如在迷宫里面,给你一个坐标(x,y),通过方向数组,借助循环,我们创建了一个新坐标(x1,y1),如果我们想表示(x1,y1)上一个经过的地方是(x,y),就可以用pre[(x1,y1)]=(x,y)来表示。在不同场合,结点可以是不同的东西(可以是坐标,一个数...),不必太多纠结(因为这东西本身是从‘’树‘’里面引出来的)】。到此,你可能还不明白创建这样的前驱关系有什么用,没关系,我再举个例子,把pre展开,pre={'(0,0):(1,1),(1,1):(2,2),(2,2):(3,3),(3,3):(4,5)},根据你所学的知识pre[(4,5)]应该等于(3,3)。然后现在我有五个点,他们的坐标分别是(0,0)(1,1)(2,2)(3,3)(4,5),且已知(0,0)是起点,(4,5)是终点,想请问你,起点到终点的路径长度为多少?下面用一段代码表示,你一定能看懂:通过反复的迭代,使得最终pre[end]=st,每迭代一次,路径+1

st=(0,0)
end=(4,5)
step=1
while pre[end]!=st:
    end=pre[end]
    step+=1
print(step)

所以,pre字典最重要的就是记录前驱关系,当创建完所有结点的关系时,通过终点倒着访问,当访问到起点,结束,总路径因而知晓。

queue:队列,你可以把它简单的理解为一个列表,只不过我们把索引为0的元素取出来,对于队列的作用这里不再赘述,没有基础的建议去看<<算法图解>>(Python语言描述的,对PY党友好),很快上手

judge:函数,用来判断我们新创建的结点是否合法,合法要根据具体的题意,比如在迷宫里面,坐标不能越界,不能是障碍物,不能已经访问过....

本题而言,属于直线型运动,不妨假设初始点在-97,目标为0,如果搜到0,那么就输出步数。如果没搜到0,把当前结点(数字)的下一个状态也就是新结点加入queue队列(前提要判断过合法),直至找到0。

解释几个细节的地方:judge函数中x in pre.keys()的作用,如果满足条件,说明x已经有了前驱结点,也就是x之前已经被pre[x]这个结点作为新结点创建,也就说明x已经访问过了,从这里也可以看出,每个结点只有一个前驱结点,当所有的结点都创建好了前驱关系,整张图也就搜完了。因此,如果x not in pre.keys(),证明x还没有前驱结点即x还没有被访问过,x合法,tmp(当前结点)可以作为x的前驱结点,否则,x已经有前驱结点,x已经访问过,不合法。如果你还问我为什么已经访问过的为什么不合法,我会告诉你因为第一次访问过的状态已经是距离出发点最近的,那么你已经知道这个状态下结点p距离出发点的距离是最近的,那么下一种状态你又访问到它,它必然不会优于刚刚提到的距离。

AC代码:答案97

dir=[97,-127]
def judge(x):
    if x>0 or x in pre.keys():
        return False
    else:
        return True
pre={}
queue=[-1]
def bfs():
    global queue
    while queue:
        tmp=queue.pop(0)
        if tmp==0:
            step=1
            while pre[tmp]!=-1:
                tmp=pre[tmp]
                step+=1
            print(step)
            break
        else:
            for i in range(2):
                ne=tmp+dir[i]
                if judge(ne):
                    queue.append(ne)
                    pre[ne]=tmp
bfs()

2.ACWing蓝桥杯模拟赛:农田灌溉

 这是一个多源BFS的问题,求最短距离。

与单源不同的地方在于,它需要单独创建一个列表d,d[i]代表第i个农田被灌满的最短时间

还多了一个递推关系:如果i的前驱结点是j,d[i]=d[j]+#单独灌满第i个农田花费的时间

一开始的出发点,也就是初始的几个多源,入队,把他们走一次能够访问到的结点p入队,(前提p合法),并更新d[p]。这里判断p的合法性:如果d[p]不等于初始化的值,说明未访问过,合法,否则已经记录灌满p的最短时间,无需入队,不合法。

所以唯一不同点在于,多了一个记录列表,不同的合法性判断条件,其他都一样。

AC代码

t=int(input())


def bfs(n,k,a):
    d=[-float('inf') for i in range(n+1)]#第i个农田被覆盖的最短时间
    for i in a:
        d[i]=1
    queue=a.copy()
    dir=[-1,1]
    while queue:
        tmp=queue.pop(0)
        for i in range(2):
            ne=tmp+dir[i]
            if 1<=ne<=n and d[ne]==-float('inf'):
                d[ne]=d[tmp]+1
                queue.append(ne)
    print(max(d))
for i in range(t):
    n,k=map(int,input().split())
    a=list(map(int,input().split()))
    bfs(n,k,a)

 3.NOIP提高组:跳石头 洛谷P2678

 这道题和蓝桥杯算法提高:打包很像!

 观察他们的问题:最短跳跃距离最大,最小的最大重量;

这一类题目往往可以通过二分答案来找到解,二分答案需要两个条件:有界性和单调性

有界性显然,因为整段路是L,所以答案一定小于等于L,单调性是因为如果我取了一个mid不符合,那么比mid更大的一定不符合,因为要搬的石头会更多了,如果mid符合,比mid小的一定符合,因为不需要搬的石头更多了,那我只需要往mid的右边找,直至找到最优解。

你可能有疑惑的地方:比mid更大的一定不符合,因为要搬的石头会更多了 这句话是为什么,我解释一下,比方说你mid=5,那么你就去check 5是不是可行解,怎么判断是不是可行解:首先,mid=5意味着你假设了最短距离5,设想你站在一个石头上,那么如果两个石头间距超过5,下一个石头就不需要搬走,因为最短距离是5,所以你直接跳过去,到达下一个石头。

现在,距离下一个石头的长度1,表明两石头的间距是1,这与你的假设矛盾,所以它必须搬走,计数器累加1,现在距离你为1的这个石头已经搬走了。现在你的前面又面临着一个石头,如果它距离你所处的石头的长度小于5,那么它就必须搬走,否则,你就可以直接跳过去。那么一直跳到终点,计数器统计的步数s和m(题目运行的搬走个数)比较,如果s>m,显然不符合,回到开始的问题,如果mid'>mid,那么s">=s>m,要搬的石头显然要增加,就更不符合了。同理,如果mid是一个可行解,mid'<mid,那么需要搬的石头显然更少,就一定符合。

AC代码

L,N,M=map(int,input().split())

a=[int(input()) for i in range(N)]
a.insert(len(a),L)
if N==0:
    print(L)
elif M==0:
    print(min(a))
else:
    l,r=-1,100000001
    def check(x):
        cnt=0
        flg=0
        for i in range(N):
            if a[i]-flg<x:
                cnt+=1
            else:
                flg=a[i]
        return cnt<=M
    while l+1!=r:
        mid=(l+r)//2
        if check(mid):
            l=mid
        else:
            r=mid
    print(l)

   希望uu们都能在蓝桥杯取得理想成绩!冲击省一

有关【蓝桥杯真题】18天Python组冲刺 心得总结的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

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

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

  3. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐