蓝桥杯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

告别 Vibe Coding | 一文拆解 OpenClaw、Claude Code 背后的 AI Agent 五层全能架构

告别 Vibe Coding | 一文拆解 OpenClaw、Claude Code 背后的 AI Agent 五层全能架构

告别 Vibe Coding | 一文拆解 OpenClaw、Claude Code 背后的 AI Agent 五层全能架构 最近,AI 圈简直比奈飞的连续剧还精彩。 先是那个顶着“龙虾”图标、号称“The AI that actually does things”的 OpenClaw(老粉可能还记得它叫 Clawdbot 或 Moltbot)上演了一出“更名记”,为了避嫌 Claude 可谓操碎了心; 紧接着,开源界 OpenCode 探索在前,Anthropic 官方的 Claude Code 紧随其后,一把火点燃了“终端 Agent”的热情;再看 IDE

By Ne0inhk
3分钟搞定!Windows上部署AI爬虫神器OpenClaw,小白也能飞

3分钟搞定!Windows上部署AI爬虫神器OpenClaw,小白也能飞

3分钟搞定!Windows上部署AI爬虫神器OpenClaw,小白也能飞 * 一. 环境准备 * 二. 安装与启动 OpenClaw * 2.1 配置镜像源并安装 * 2.2 初始化并部署服务 * 2.3 手动重启服务(可选) * 三. 功能验证 * 五. 附录:常用配置与路径参考 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 OpenClaw 负责提供美观的交互界面与协议中转能力,是连接用户与大模型服务的重要接入层。 一. 环境准备 * 操作系统:Windows 10 虚拟机(本文基于 VMware 环境演示) * Node.js 版本:推荐 v20 及以上 👉 下载地址:https:

By Ne0inhk
Kafka事务:构建可靠的分布式消息处理系统

Kafka事务:构建可靠的分布式消息处理系统

Kafka事务:构建可靠的分布式消息处理系统 🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河; 🛠️ 每一个算法都是我绘制的星图,指引着数据流动的最短路径; 🔍 每一次调试都是星际对话,用耐心和智慧解开宇宙的谜题。 🚀 准备好开始我们的星际编码之旅了吗? 目录 * Kafka事务:构建可靠的分布式消息处理系统 * 引言:探索Kafka事务的星际之旅 * 1. Kafka事务基础 * 1.1 什么是Kafka事务? * 1.2 为什么需要Kafka事务? * 1.3 事务与幂等性的关系 * 2. Kafka事务API详解 * 2.1 生产者事务API * 2.2 消费者-生产者事务模式 * 2.3 事务隔离级别 * 3. Kafka事务内部实现机制 * 3.1 事务协调器 * 3.2 事务日志 * 3.

By Ne0inhk
【Java EE进阶 --- SpringBoot】AOP原理

【Java EE进阶 --- SpringBoot】AOP原理

🚀 欢迎来到我的ZEEKLOG博客:Optimistic _ chen ✨ 一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步! 🚀我的专栏推荐: 专栏内容特色适合人群🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生 🚀我的承诺: ✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例 ✅ 持续更新:专栏内容定期更新,紧跟技术趋势 ✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉) 🚀 关注我,解锁更多技术干货! ⏳ 每天进步一点点,

By Ne0inhk