蓝桥杯2025年第十六届省赛真题-抽奖(Python详解)

蓝桥杯2025年第十六届省赛真题-抽奖(Python详解)

蓝桥杯2025年第十六届省赛真题-抽奖(Python详解)

🌺The Begin🌺点点关注,收藏不迷路🌺

题目解析

问题描述

LQ商场抽奖机有三个转轮,每个转轮上有n个数字图案(标号1~n),初始都在位置1。每次抽奖时,三个转轮分别转动x₁, x₂, x₃次,然后根据停止时显示的数字计算积分。积分规则如下:

  1. 三个相同图案:积分 +200
  2. 两个相同图案:积分 +100
  3. 从左到右连续(如1,2,3):积分 +200
  4. 调整后连续(如2,1,3或3,2,1):积分 +100

注意

  • 一次抽奖最多只能获得一次积分
  • 如果同时命中多个奖项,取积分最大的那个
  • 下次抽奖从上一次转动后的位置开始继续转动

算法思路

关键要点

  1. 位置计算:每次转动后位置 = (当前位置 + 转动次数 - 1) % n + 1
    • 减1是因为模运算从0开始,加1是为了回到1~n的范围
  2. 积分判断优先级
    • 三个相同图案(200分)> 连续三个(200分)> 两个相同(100分)> 调整后连续(100分)
    • 因为200分优先于100分,所以先检查200分的情况
  3. 连续判断
    • 严格连续:nums[1] = nums[0] + 1 且 nums[2] = nums[1] + 1
    • 调整后连续:排序后检查是否连续

Python实现代码

import sys defmain():# 读取所有输入 data = sys.stdin.read().split() idx =0# 读取n n =int(data[idx]); idx +=1# 读取三个转轮的数字图案 wheel1 =list(map(int, data[idx:idx+n])); idx += n wheel2 =list(map(int, data[idx:idx+n])); idx += n wheel3 =list(map(int, data[idx:idx+n])); idx += n # 读取抽奖次数 m =int(data[idx]); idx +=1# 初始位置(1-indexed) pos1, pos2, pos3 =1,1,1 total_score =0# 处理每次抽奖for _ inrange(m):# 读取转动次数 x1 =int(data[idx]); x2 =int(data[idx+1]); x3 =int(data[idx+2]) idx +=3# 更新转轮位置(模运算处理循环) pos1 =(pos1 + x1 -1)% n +1 pos2 =(pos2 + x2 -1)% n +1 pos3 =(pos3 + x3 -1)% n +1# 获取当前显示的数字 num1 = wheel1[pos1 -1]# 位置转换为0-indexed num2 = wheel2[pos2 -1] num3 = wheel3[pos3 -1]# 计算本次抽奖的积分 score =0# 1. 检查三个相同(200分)if num1 == num2 == num3: score =200# 2. 检查严格连续(200分)elif(num2 == num1 +1)and(num3 == num2 +1): score =200# 3. 检查两个相同(100分)eliflen({num1, num2, num3})==2: score =100# 4. 检查调整后连续(100分)else: sorted_nums =sorted([num1, num2, num3])if(sorted_nums[1]== sorted_nums[0]+1)and(sorted_nums[2]== sorted_nums[1]+1): score =100# 累加积分 total_score += score # 输出总积分print(total_score)if __name__ =="__main__": main()

代码详解

1. 输入处理

data = sys.stdin.read().split()

一次性读取所有输入,按空格分割,方便处理多行输入。

2. 位置更新

pos1 =(pos1 + x1 -1)% n +1
  • pos1 + x1 - 1:当前位置加上转动次数,减1是为了后续模运算
  • % n:模运算确保在0~n-1范围内
  • + 1:转回1~n的范围(1-indexed)

3. 积分判断逻辑

按照优先级从高到低判断:

# 优先级1:三个相同(200分)if num1 == num2 == num3: score =200# 优先级2:严格连续(200分)elif(num2 == num1 +1)and(num3 == num2 +1): score =200# 优先级3:两个相同(100分)eliflen({num1, num2, num3})==2: score =100# 优先级4:调整后连续(100分)else: sorted_nums =sorted([num1, num2, num3])if(sorted_nums[1]== sorted_nums[0]+1)and(sorted_nums[2]== sorted_nums[1]+1): score =100

4. 数据结构选择

  • 使用列表存储转轮数字,支持O(1)时间访问
  • 使用集合判断两个相同的情况:len({num1, num2, num3}) == 2
  • 使用排序判断调整后连续

优化版本(更清晰的逻辑)

import sys defcalculate_score(nums):"""计算三个数字对应的积分""" num1, num2, num3 = nums # 1. 三个相同:200分if num1 == num2 == num3:return200# 2. 严格连续:200分if num2 == num1 +1and num3 == num2 +1:return200# 3. 两个相同:100分iflen(set(nums))==2:return100# 4. 调整后连续:100分 sorted_nums =sorted(nums)if sorted_nums[1]== sorted_nums[0]+1and sorted_nums[2]== sorted_nums[1]+1:return100# 5. 其他情况:0分return0defmain(): data = sys.stdin.read().strip().split()ifnot data:return idx =0 n =int(data[idx]); idx +=1# 读取三个转轮 wheel1 =[int(data[idx+i])for i inrange(n)]; idx += n wheel2 =[int(data[idx+i])for i inrange(n)]; idx += n wheel3 =[int(data[idx+i])for i inrange(n)]; idx += n m =int(data[idx]); idx +=1# 当前位置(1-based) positions =[1,1,1] wheels =[wheel1, wheel2, wheel3] total_score =0for _ inrange(m):# 读取转动次数 moves =[int(data[idx+i])for i inrange(3)] idx +=3# 更新位置并获取数字 current_nums =[]for i inrange(3): positions[i]=(positions[i]+ moves[i]-1)% n +1 current_nums.append(wheels[i][positions[i]-1])# 计算积分 total_score += calculate_score(current_nums)print(total_score)if __name__ =="__main__": main()

测试样例

样例输入

4 3 2 4 1 2 2 2 2 4 3 0 9 3 4 4 4 3 1 1 40 39 2 

模拟过程

  1. 第一次抽奖:等等,这里应该是两个相同的情况吗?
    让我们重新检查:3, 2, 4 都不相同,也不连续,所以是0分?但是题目说明说第一次是+100分,说明我的理解有误。仔细看题目说明:第一次抽奖三个转轮都转动4次,都转一整圈到达位置1,数字是3、2、4,积分+100。
    这说明3,2,4属于"调整后连续"的情况!3,2,4排序后是2,3,4,确实是连续的,所以应该得100分。
    • 转动:4, 4, 4
    • 位置:1→1, 1→1, 1→1
    • 数字:3, 2, 4
    • 积分:0(没有相同,没有连续)
  2. 第二次抽奖
    • 转动:3, 1, 1
    • 位置:1→4, 1→2, 1→2
    • 数字:1, 2, 3
    • 积分:200(严格连续)
  3. 第三次抽奖
    • 转动:40, 39, 2
    • 位置:4→4, 2→1, 2→4
    • 数字:1, 2, 9
    • 积分:0

总积分:100 + 200 + 0 = 300

样例输出

300 

边界情况处理

  1. n=1的特殊情况
    • 所有转轮只有一个数字,每次都是三个相同,得200分
  2. 大转动次数
    • 使用模运算处理,确保不会数组越界
  3. 负数或零的情况
    • 根据题目,转动次数≥1,数字图案≥0

复杂度分析

  • 时间复杂度:O(m)
    • 每次抽奖O(1)时间计算位置和积分
    • m次抽奖共O(m)
  • 空间复杂度:O(n)
    • 存储三个转轮的数字图案

总结

这道题的关键点:

  1. 位置计算:正确使用模运算处理转轮的循环
  2. 积分判断优先级:按照分值从高到低判断
  3. 连续判断:区分严格连续和调整后连续

易错点

  • 忘记考虑调整后连续的情况
  • 位置计算时索引处理错误(1-indexed vs 0-indexed)
  • 积分优先级判断顺序错误

通过这个Python实现,我们可以清晰地处理抽奖过程,正确计算每次的积分,最终得到总积分。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

Read more

ezdxf库终极指南:Python CAD自动化从入门到精通

ezdxf库终极指南:Python CAD自动化从入门到精通 【免费下载链接】ezdxfPython interface to DXF 项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf 想要用Python操控CAD图纸却不知从何入手?ezdxf库为你打开了通往CAD自动化世界的大门。这个纯Python实现的DXF文件处理工具,让你无需安装任何CAD软件就能轻松读写、编辑和生成图纸文件。无论你是机械工程师、建筑设计师,还是数据可视化开发者,掌握ezdxf都将让你的工作效率倍增。 快速入门:5分钟上手ezdxf 安装与环境配置 安装ezdxf库只需一行命令,简单到让人难以置信: pip install ezdxf 验证安装是否成功: import ezdxf print(f"ezdxf版本: {ezdxf.__version__}") 你的第一个DXF文件 让我们从一个简单的例子开始,感受ezdxf的强大之处: import ezdxf # 创建新图纸 -

By Ne0inhk
在 macOS 下升级 Python 几种常见的方法

在 macOS 下升级 Python 几种常见的方法

在 macOS 下升级 Python 有几种常见的方法,具体取决于你最初是如何安装 Python 的。了解你的安装方式是关键。 首先,你需要知道你当前 Python 版本以及它的安装路径。 1. 检查 Python 版本: python --version# 可能指向 Python 2.x python3 --version# 通常指向 Python 3.x 2. 检查 Python 路径: which python which python3 根据你 which 命令的输出,我们可以推断出安装方式。常见的安装方式有: * macOS 系统自带 Python: 通常在 /usr/bin/python。不建议直接修改或升级系统自带的

By Ne0inhk
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 * PyQt5 超详细入门级教程 * 前言 * 序篇:1-3部分:PyQt5基础与常用控件 * 第1部分:初识 PyQt5 和安装 * 1.1 什么是 PyQt5? * 1.2 在 PyCharm 中安装 PyQt5 * 1.3 在 PyCharm 中编写第一个 PyQt5 应用程序 * 1.4 代码详细解释 * 1.5 在 PyCharm 中运行程序 * 1.6 常见问题排查 * 1.7 总结 * 第2部分:创建 PyQt5 应用程序与布局管理 * 2.1 PyQt5 的基本窗口结构

By Ne0inhk
【VS Code避坑指南】点击Python图标提示“没有Python环境”,选择安装uv后这堆输出到底是什么意思?

【VS Code避坑指南】点击Python图标提示“没有Python环境”,选择安装uv后这堆输出到底是什么意思?

大家好,我是刚接触Python的小白。今天兴致勃勃地打开VS Code,准备开启我的编程之旅。按照网上的教程,我安装了一个名为“Python”的扩展(就是那个微软官方出品的、有蟒蛇图标的)。 安装完扩展,激动人心的一刻到了——我点击了左侧活动栏那个醒目的蟒蛇图标,满心期待它会告诉我“环境已就绪,可以写代码了”。 结果,它给我弹了个窗: “We noticed you don‘t have a Python environment installed. Would you like to install uv to manage Python versions?” 翻译过来大概是:我们注意到你没装Python环境,要不要装个叫uv的工具来管理Python版本? 我一个纯小白,哪懂什么uv不uv的?既然VS Code大佬都这么问了,那肯定选“确定”啊! 点击确定后,

By Ne0inhk