# 蓝桥杯算法赛题目打卡

蓝桥杯算法赛题目打卡

在这里插入图片描述

在蓝桥杯算法赛中,我们常常会遇到各种挑战性的题目。本文将详细解析两个典型的题目,包括其问题描述、解题思路、算法步骤及其代码实现。这两个题目分别涉及到十二生肖的检查和分身采摘蟠桃的优化问题。

题目一:唐僧玩梗

问题描述

唐僧在穿越到现代后,玩起了网络游戏中的梗,规定徒弟和坐骑必须是十二生肖中的动物,否则需要主动退出师门。现需要你输出一个整数,表示唐僧剩余徒弟和坐骑的总数。

题目解析

根据题目描述,我们需要对给定的徒弟和坐骑进行检查,判断其是否属于十二生肖中的动物。最终输出符合条件的徒弟和坐骑数量。

解题思路
  1. 定义十二生肖集合:用来判断动物是否属于生肖。
  2. 定义徒弟和坐骑及其对应动物:列出所有的徒弟和坐骑及其对应的动物。
  3. 统计符合条件的徒弟和坐骑数量:遍历字典,检查每个动物是否在生肖集合中,如果在,则增加计数。
代码实现
# 定义十二生肖集合
zodiac_animals = {"Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"}

# 定义徒弟和坐骑及其对应动物
disciples_and_mounts = {
    "孙悟空": "Monkey",
    "猪八戒": "Pig",
    "沙僧": "Human",  # 人形,不属于十二生肖
    "小白龙": "Dragon"
}

def count_zodiac_disciples(disciples, zodiac):
    """
    统计字典中对应的动物是否属于十二生肖,并返回有效的徒弟和坐骑数量。
    """
    remaining_count = 0
    for name, animal in disciples.items():
        if animal in zodiac:
            remaining_count += 1
    return remaining_count

# 计算剩余的徒弟和坐骑的总数
remaining_count = count_zodiac_disciples(disciples_and_mounts, zodiac_animals)

# 输出结果
print(f"剩余的徒弟和坐骑中属于十二生肖的总数是:{remaining_count}")

解释

  1. 定义集合和字典:首先定义一个包含十二生肖的集合以及一个字典记录徒弟和坐骑及其对应的动物。
  2. 统计符合条件的数量:通过遍历字典,检查每个动物是否在十二生肖集合中,并统计符合条件的数量。
  3. 输出结果:最终输出符合条件的徒弟和坐骑的数量。
    在这里插入图片描述

题目二:分身采摘蟠桃

问题描述

唐僧的分身们正在采摘蟠桃。由于道路是环形的,每个分身会根据当前道路的状态决定采摘次数。现要求计算所有分身采摘蟠桃次数之和的最大可能值。

题目解析

我们需要处理一个环形道路上的分身采摘问题,通过优化算法来最大化采摘次数的总和。

解题思路
  1. 环形道路处理:由于道路是环形的,我们需要考虑边界连接的问题。
  2. 状态更新:记录每条道路的状态,根据是否有天兵把守来决定采摘次数。
  3. 滑动窗口:使用滑动窗口技术来处理环形结构,最大化在一个周期内的采摘次数。
算法步骤
  1. 解析输入:读入道路数量 ( N ) 和状态字符串 ( S )。
  2. 双倍字符串:将状态字符串 ( S ) 拼接一遍形成 double_S,方便处理环形问题。
  3. 遍历状态字符串:使用滑动窗口技术计算最大采摘次数。
  4. 输出结果:最终计算得到的最大采摘次数即为所求。
代码实现
def max_peach_picks(N, S):
    # 双倍字符串,方便处理环形结构
    double_S = S + S
    
    max_peaches = 0
    current_peaches = 0
    
    # 遍历状态字符串,模拟每个分身的采摘过程
    for i in range(2 * N):
        if double_S[i] == 'L':
            current_peaches += 1
        else:
            current_peaches = 0
        
        # 我们只关心窗口长度为 N 的段
        if i >= N:
            if double_S[i - N] == 'L':
                current_peaches -= 1
        
        # 更新最大采摘次数
        max_peaches = max(max_peaches, current_peaches)
    
    return max_peaches

# 读取输入
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
S = data[1]

# 计算并输出结果
print(max_peach_picks(N, S))

解释

  1. 双倍字符串:将状态字符串 ( S ) 复制一遍形成 double_S,以简化环形处理。
  2. 滑动窗口:使用长度为 ( N ) 的滑动窗口在 double_S 上进行遍历,计算最大采摘次数。
  3. 状态更新:根据道路状态更新当前采摘次数,并计算最大值。
    在这里插入图片描述

总结

在蓝桥杯算法赛中,通过对这些题目的研究和解决,我们不仅可以提高对算法的理解,还能增强实际编程能力。无论是处理简单的集合和字典问题,还是复杂的环形结构优化问题,系统的分析和优化方法都是解决问题的关键。通过不断练习和总结,我们能够更好地掌握编程技巧,并在比赛中取得优异成绩。

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无线网络优化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值