【C++】P2550 [AHOI2001] 彩票摇奖

文章目录
- 💯前言
- 💯题目描述
- 输入格式:
- 输出格式:
- 输入输出样例:
- 💯题解思路
- 1. 问题解析
- 💯我的实现
- 实现逻辑
- 问题分析
- 💯老师的实现
- 实现逻辑
- 优势分析
- 💯代码优化与拓展
- 优化方案
- 改进代码
- 优化效果
- 💯小结

💯前言
- 在C++编程学习中,理解和解决复杂问题的能力是关键。本篇文章围绕一个实际的竞赛题目展开——“彩票中奖判定问题”,从题目描述、我的实现、老师的实现到代码优化和拓展,逐步展开详细的分析和讲解,希望帮助读者提升编程思维。
C++ 参考手册

💯题目描述
以下是题目原文:
P2550 [AHOI2001] 彩票摇奖

题目编号:P2550 [AHOI2001] 彩票摇奖
为了丰富人群的生活,支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:
- 每张彩票上印有 7 个各不相同的号码,且这些号码的取值范围为 1~33。
- 每期开奖时随机摇出一个由 1~33 这 33 个自然数构成的中奖号码。
- 共设置 7 个奖项,特等奖——一等奖至六等奖。
中奖规则如下:
- 特等奖: 要求彩票上 7 个号码都出现在中奖号码中。
- 一等奖: 要求彩票上 6 个号码出现在中奖号码中。
- 二等奖: 要求彩票上 5 个号码出现在中奖号码中。
- 三等奖: 要求彩票上 4 个号码出现在中奖号码中。
- 四等奖: 要求彩票上 3 个号码出现在中奖号码中。
- 五等奖: 要求彩票上 2 个号码出现在中奖号码中。
- 六等奖: 要求彩票上 1 个号码出现在中奖号码中。
注意:先忽略开奖号码与彩票号码中各个号码出现的顺序。例如,如果中奖号码为 23 31 11 14 19 17 18,则彩票 12 8 9 23 11 16 7 中由于其有两个号码(23 和 11)出现在中奖号码中,所以以该彩票算作五等奖。
输入格式:
- 输入的第一行为一个自然数 n n n,表示小明购买彩票数。
- 第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码。
- 在随后的 n n n 行中,每行有 7 个介于 1 和 33 之间的自然数,分别表示小明所买的 1 张彩票。
输出格式:
依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。
输入输出样例:
输入:
2
23 31 11 14 19 17 18
12 8 9 23 11 16 7
17 10 21 29 9 31
输出:
0 0 0 0 0 1 1
💯题解思路
1. 问题解析
本题的关键是如何高效判断每张彩票和中奖号码之间的匹配程度,并据此统计各个奖项的中奖张数。
主要挑战在于:
- 号码匹配的效率: 如何快速比较彩票号码和中奖号码。
- 中奖等级的计算: 根据匹配数量归类到正确的奖项。
下面将从我的实现和老师的实现分别展开分析。
💯我的实现
以下是我的实现代码:
#include <iostream>
#include <cmath>
using namespace std;
int arr1[1005];
int arr2[1005][1005];
int arr3[7];
int main()
{int n = 0;cin >> n;for(int i = 0; i < 7; i++)cin >> arr1[i];for(int i = 0; i < n; i++){for(int j = 0; j < 7; j++){cin >> arr2[i][j];}}for(int i = 0; i < n; i++){int count = 0;for(int j = 0; j < 7; j++){for(int m = 0; m < 7; m++){if(arr1[m] == arr2[i][j])count++;}}if(count != 0)arr3[7 - count]++;}for(int i = 0; i < 7; i++){cout << arr3[i] << " ";}return 0;
}

实现逻辑
-
输入部分:
- 使用
arr1存储中奖号码。 - 使用二维数组
arr2存储每张彩票的 7 个号码。
- 使用
-
匹配逻辑:
- 使用双重嵌套循环对每张彩票的每个号码和中奖号码进行逐一比对。
- 统计匹配数量
count,并根据7 - count更新中奖等级计数。
-
输出部分:
- 按特等奖到六等奖的顺序输出中奖张数。
问题分析
- 效率低下:
- 双重嵌套循环导致时间复杂度为 O ( n × 7 × 7 ) O(n \times 7 \times 7) O(n×7×7),对于较大规模输入,效率较低。
- 冗余判断:
- 判断
if(count != 0)是多余的,因为即使匹配数量为 0,更新arr3[7 - count]也不会出错。
- 判断
💯老师的实现
以下是老师的实现代码:
#include <iostream>
using namespace std;int ans[7]; // 中奖数字
int ans_c[7]; // 中奖个数int main()
{int n = 0;int num = 0;cin >> n;// 输入中奖号码for (int i = 0; i < 7; i++){cin >> ans[i];}// n次测试while (n--){int cnt = 0; // 统计匹配的号码数量// 循环输入彩票上的7个号码for (int i = 0; i < 7; i++){cin >> num;// 每个号码和一次中奖号码比较for (int j = 0; j < 7; j++){if (num == ans[j]){cnt++;break;}}}ans_c[7 - cnt]++; // 更新中奖个数}for (int j = 0; j < 7; j++){cout << ans_c[j] << " ";}return 0;
}

实现逻辑
- 输入部分:
- 使用数组
ans存储中奖号码。
- 使用数组
- 匹配逻辑:
- 使用嵌套循环对比彩票号码与中奖号码,统计匹配数量
cnt。 - 使用
break提前终止内层循环,减少多余操作。
- 使用嵌套循环对比彩票号码与中奖号码,统计匹配数量
- 结果更新:
- 根据
7 - cnt更新中奖等级。
- 根据
优势分析
- 逻辑清晰:
- 将匹配操作和统计结果分离,代码结构简单易懂。
- 效率合理:
- 使用
break提前退出循环,优化部分操作。
- 使用
💯代码优化与拓展
优化方案
通过引入哈希表进一步提升效率。
改进代码
#include <iostream>
#include <unordered_set>
using namespace std;int main() {int n; // 彩票数量cin >> n;unordered_set<int> winning_numbers; // 存储中奖号码for (int i = 0; i < 7; i++) {int number;cin >> number;winning_numbers.insert(number);}int prize_count[7] = {0}; // 统计每个奖项的中奖张数while (n--) {int match_count = 0; // 当前彩票匹配的号码数量for (int i = 0; i < 7; i++) {int ticket_number;cin >> ticket_number;if (winning_numbers.count(ticket_number)) {match_count++;}}prize_count[7 - match_count]++;}for (int i = 0; i < 7; i++) {cout << prize_count[i] << (i == 6 ? "" : " ");}return 0;
}

优化效果
- 使用哈希表代替嵌套循环,比对效率从 O ( 7 × 7 ) O(7 \times 7) O(7×7) 降为 O ( 7 ) O(7) O(7)。
- 改善代码可读性,增强灵活性。
💯小结

通过对“彩票中奖判定问题”的分析和代码实现,我们理解了从问题分解到优化的完整过程。无论是初步实现还是优化版本,掌握问题的本质和高效解决方案是编程学习的重要目标。希望本篇文章能对读者有所帮助!

![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
相关文章:
【C++】P2550 [AHOI2001] 彩票摇奖
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…...
并发服务器框架——zinx
zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架,它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能,包括但不限于连接管理、数据编解码、业务处理、负载均衡等,适用于构建各种 TCP 网络服务,如游戏…...
Unity 中计算射线和平面相交距离的原理
有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交…...
浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验
一、前言:为什么反外挂与安全这么重要? 对于任何一款线上棋牌游戏而言,公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式,不仅会毁坏玩家体验,更会导致游戏生态崩塌、口碑下滑…...
《无力逃脱》V1.0.15.920(59069)官方中文版
艾丹是一名三臂赏金猎人,他必须追捕银河系中最危险、最难以捉摸的割喉者。 有些悬赏是金钱,有些则是有价值的信息。艾丹可以利用这些信息找到让他走上这条路的人,同时也会卷入一个全银河系的阴谋中。 拥有三条手臂可以让你同时对付更多的敌…...
六种主流服务器的选择与使用
网络的运行离不开各种服务器,它们各司其职,为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种:Web服务器 Web服务器是互联网的核心。当你打开一个网站,比如百度或淘宝,浏览器会…...
TiDB 升级至高版本提示'mysql.tidb_runaway_watch' doesn't exist 问题处理
作者: asd80703406 原文来源: https://tidb.net/blog/90394c97 背景 近期发现很多人从低版本升级至TiDB v7 或者v8版本,均遇到了tidb-server启动失败,提示报错如下: ["get runaway watch record failed"…...
GRU-PFG:利用图神经网络从股票因子中提取股票间相关性
“GRU-PFG: Extract Inter-Stock Correlation from Stock Factors with Graph Neural Network” 论文地址:https://arxiv.org/pdf/2411.18997 摘要 股票预测模型可以分为两个主要类别:第一类,例如GRU和ALSTM,这些模型仅基于股票…...
数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例
摘要: 在数字化转型的浪潮中,零售行业正经历着前所未有的变革。特别是在供应链管理方面,线上线下融合、数据孤岛、消费者需求多样化等问题日益凸显,对零售企业的运营效率与市场竞争力构成了严峻挑战。本文深入探讨了零售行业供应…...
安卓Activity执行finish后onNewIntent也执行了
测试反应投屏时下一集可能播放不成功。 首先看一下日志: onCompletion onCast handlerMessage: 2 finish: PlayerActivityabc7fdc onPause: PlayerActivityabc7fdc onNewIntent: PlayerActivityabc7fdc onResume: PlayerActivityabc7fdc onPause: PlayerActivityab…...
数据结构.期末复习.学习笔记(c语言)
《数据结构》复习概要 一、概论 二、基础1. 基本概念2. 四种逻辑结构及特点3. 算法的概念、特性4. 算法设计的4个要求 三、线性结构1.顺序表2.单链表3.循环链表双向链表4.栈(后进先出)5.队列(先进先出) 四、树和二叉树1.树2.二叉…...
Kafaka安装与启动教程
1.下载 先去官网Apache Kafka可以查看到每个版本的发布时间。选择你要安装的版本。 然后进入linux建立要存放的文件夹,用wget命令下载 2.安装 先解压缩: tar -xvzf kafka_2.12-3.5.1.tgz -C ../ 3.配置文件 修改server.properties: cd .…...
根据docker file 编译镜像
比如给到一个Dockerfile 第一步编译镜像 cd /path/to/Dockerfiledocker build -t <DOCKER_IMAGE_NAME> . build 命令编译镜像 -t 镜像名字 . 指dockerfile 所在目录 如果遇到报错 [] Building 0.3s (3/3) FINISHED …...
联邦学习的 AI 大模型微调中,加性、选择性、重参数化和混合微调
联邦学习的 AI 大模型微调中,加性、选择性、重参数化和混合微调 在联邦学习的 AI 大模型微调中,加性、选择性、重参数化和混合微调是不同的操作方式,具体如下: 加性微调 定义与原理:加性微调是在原始模型的基础上添加额外的可训练参数来进行模型调整。这种方式不会改变原…...
android 外挂modem模块实现Telephony相关功能(上网,发短信,打电话)
一.背景 当前模块不支持Telephony相关的功能,例如上网、发短信等功能,就需要外挂另一个模块实现此功能,这就是外挂modem模块实现Telephony功能,此篇主要就是说实现外挂modem模块功能中的Framework层实现逻辑,如下流程是在Android 13中实现的外挂pcie模块的流程 二.ril库相…...
【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练
GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…...
数据中台与数据治理服务方案[50页PPT]
本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心,通过整合各部门业务系统数据,进行建模与加工,以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题,确保数据…...
【Qt】将控件均匀分布到圆环上
1. 关键代码 for(int i0; i<10; i){/*m_panLabelIcon - 大圆环控件m_slotsIcon[i] - 小圆控件*/QString idxStr QString::number(i1);m_slotsIcon[i] new QLabel(m_panLabelIcon);m_slotsIcon[i]->setFont(ftSlot);m_slotsIcon[i]->setText(idxStr);m_slotsIcon[i]-…...
第四、五章补充:线代本质合集(B站:小崔说数)
视频1:线性空间 原视频:【线性代数的本质】向量空间、基向量的几何解释_哔哩哔哩_bilibili 很多同学在学习线性代数的时候,会遇到一个困扰,就是不知道什么是线性空间。...
2025年贵州省职业院校技能大赛信息安全管理与评估赛项规程
贵州省职业院校技能大赛赛项规程 赛项名称: 信息安全管理与评估 英文名称: Information Security Management and Evaluation 赛项组别: 高职组 赛项编号: GZ032 1 2 一、赛项信息 赛项类别 囚每年赛 □隔年赛(□单数年…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
