4. 劲舞团python解法——2024年省赛蓝桥杯真题

问题描述:4.劲舞团 – 蓝桥云课

小蓝最近迷上了一款名为 “劲舞团” 的游戏,具体来说,只要按照游戏中给出的键位提示依次按出对应的键位,游戏人物便可以跟随节奏跳舞。对于连续的 K 次正确敲击,如果任意连续的两次敲击间间隔时间都小于等于 1s,那么我们称这是一次 K 连击。现在给出一局小蓝的游戏记录文件,log.txt 中记录了 N 条记录,每条记录有三个字段,依次为正确的敲击字符、小蓝打出的字符、 打出字符的时间对应的毫秒时间戳。现在请你计算下最长的 K 连击是多少,你只需要输出 K 的值。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

问题分析

本题在官方分类中为中等难度题目,真正分析的时候,你将发现,比如滑动窗口、动态DP这些高大上的算法啊,有的时候不学其实影响真的挺大的,所以我建议在看完本题之后,没有思路或者无从下手的同学又可以喜提去哔哩哔哩大学进修喽,当然等你学成归来之后就会发现,在本题中这些算法几乎用不上

官方给定了本题的示例文本 log.txt ,将其保存到本地(点击那个蓝色的字体,然后在弹出的窗口中右键另存为),在仔细观察这个txt文本之后,你会发现,本题中时间戳是完完全全顺序的!!并未被打乱(感谢仁慈的出题者wuhu~)

如果是被打乱的时间戳,那本题又将会是另一个话题了(将一个包含大量且多种数据格式的乱序文件按照某一种方式进行快速排序(`へ´))

那么言归正传,在本题中,我们几乎只需要做三件事:

  • 1, 读入log.txt文件

  • 2,遍历文件中的数据,在本题中,我们应该做的事,比较每一行的第一个数据元素与第二个数据元素是否相同

  • 3,在 2 的基础上,判断当前操作的时间戳和上一次操作的时间戳之差是否满足小于等于1s的条件

那么对于还不会使用python对文件进行读写存取等操作的同学,哔哩哔哩大学进修传送门已经为你准备好辣!python第八章-文件操作_哔哩哔哩_bilibili

进修结束之后,我们即将准备发车!

代码描述

针对本题,由于代码逻辑和代码内容比较简单,这里不再做额外的解释,如果您对此还有疑问,欢迎评论区或者私信讨论哦~

当然有一个可能会被忽略的点需要提一提,以下内容对于本题并不是很重要,但是对于那种只给出一部分参考用例的文件操作题中还是比较关键的,我在代码中保留了这个思维,希望同学们可以留意到这一点:

代码中有一段对于 满足正确点击要求:上次操作时间戳为空 或者 符合时间间隔要求 的部分,这部分毫无疑问为满足连击要求的,本题中变量last_timestamp用于记录上次操作的时间戳,便于与当前操作时间戳做差判断,current_k = 0用于记录当前的第几次K连击,last_timestamp初始化为None,当last_timestamp为空时表示当前读入的操作实际为记录的第一次操作,对于这个的处理,其实是为了应对在按键点击正确的情况下第一个操作是满足条件的这种情况,对应的current_k += 1,因为当前无法判断后一次操作与当前正确操作的时间间隔是否符合条件,如果符合条件,自然是第二次K连击,如果只是时间戳不符合条件,则当前操作应当重新看做是第一次K连击,这个逻辑希望同学们理解,如果觉得文字绕的话,也可以参考以下的示意图:

那么本题代码如下:

def calculate_longest_k_combo(log_file_path):
    with open(log_file_path, 'r') as file:
        logs = file.readlines()

    # 初始化变量
    longest_k = 0
    current_k = 0
    last_timestamp = None

    # 遍历日志记录
    for log in logs:
        correct_char, typed_char, timestamp = log.strip().split()
        timestamp = int(timestamp)

        # 检查是否正确敲击并且时间间隔是否小于等于1秒
        if correct_char == typed_char:
            if last_timestamp is None or (timestamp - last_timestamp) <= 1000: # 见文章中的解析
                current_k += 1
            else:
                current_k = 1
        else:
            current_k = 0

        # 更新最长连击
        if current_k > longest_k:
            longest_k = current_k

        # 更新最后的时间戳
        last_timestamp = timestamp

    return longest_k

# 假设log.txt文件位于当前目录
log_file_path = 'log.txt'
print(calculate_longest_k_combo(log_file_path))

本地代码运行结果:

提交答案到官网:

那么本题到此就结束了, 请同学们及时整理学习心得, 前方我们即将踏入新的征程!

写在后面

在官网的定位中, 本题只是填空题, 同学们最后只需要输出正确的答案即可, 在官网中请不要提交完整的代码哦~

如果您在阅读本文的过程中有所收获,或者有任何宝贵的建议和想法,欢迎通过邮箱或是微信等方式给我留言交流,您的每一次建议都将是我前进的动力!在此,博主斗胆向您提出一个小小的请求,如果您觉得本文给您带来了一丝启发,不妨动动手指,给予一点点鼓励。万水千山总是情,您的打赏,哪怕只是 0.1 元,也是对博主莫大的支持!(悄悄告诉您,博主正在为服务器众筹中 (×﹏×),您的每一份心意都将助力博主走得更远!)感谢您的慷慨,愿我们的缘分如同这网络世界,绵长不断

上一篇
下一篇