【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 一、赛项信息 赛项类别 囚每年赛 □隔年赛(□单数年…...
10个宝藏资源网站盘点
以下盘点10个资源类网站,所有网站均不重复,涵盖综合资源、电子书、影视、音乐、办公素材、在线工具等多个品类,涵盖日常学习、办公、娱乐等多种使用场景,资源实用、分类清晰,供大家日常参考备用。1.知源网网址…...
Spring AI ETL进阶:定制中文元数据增强与Milvus向量化存储实战
1. Spring AI ETL的核心价值与应用场景 在处理中文文本数据时,传统的ETL流程常常会遇到语义理解不准确、上下文丢失等问题。Spring AI提供的ETL框架通过模块化设计,让开发者能够轻松构建适合中文场景的数据处理流水线。我最近在一个知识库项目中实际应用…...
常见网络攻击
DDoS攻击,CC攻击 CC攻击 DDoS的一种 发送大量的合法请求消耗应用层的资源(CPU,内存,数据等),耗尽资源,比如在教务网站中写死循环脚本持续访问某个资源,无技术难度 防御: 对同IP限流,验证码,行为分析 DDoS 全名分布式拒绝攻击,攻击者控制大量僵尸设备(被植入病毒的电脑,服…...
Elasticsearch实战篇:索引库、文档与JavaRestClient操作指南
Elasticsearch 实战篇:索引库、文档与 JavaRestClient 操作指南整理自黑马程序员《SpringCloud微服务开发与实战》Elasticsearch01 课程 对应章节:索引库操作、文档操作、JavaRestClient 客户端一、索引库操作 (Index Operations) 索引库类似于 MySQL 中…...
STM32调试实战:Keil MDK + J-Link下局部变量消失的5种排查姿势
STM32调试实战:Keil MDK J-Link下局部变量消失的5种排查姿势 调试嵌入式系统时,局部变量突然"消失"是开发者常遇到的棘手问题。当你在Keil MDK环境中使用J-Link调试STM32,发现Watch窗口中的局部变量显示为"not in scope"…...
Agent能适配不同行业的合规要求吗?——2026年企业级AI Agent合规技术架构与落地全解析
在2026年的今天,AI Agent已经完成了从“实验性Demo”到“生产级数字员工”的华丽转身。对于企业决策者而言,关注焦点已从“Agent能做什么”转向“Agent在操作中是否合规”。随着《人工智能拟人化互动服务管理暂行办法》等法规的深度施行,合规…...
【限时解禁】Gartner未公开评估报告节选:Top 8低代码平台AI就绪度排名,第3名意外反超OutSystems(含API粒度级生成延迟实测数据)
第一章:智能代码生成与低代码平台融合的范式演进 2026奇点智能技术大会(https://ml-summit.org) 传统软件开发正经历一场静默而深刻的范式迁移:从“手写全栈逻辑”走向“意图驱动的协同构建”。智能代码生成模型(如基于LLM的Copilot类工具&a…...
OpenClaw部署与调用本地部署的大模型
记录一下这个部署过程:不想调云端API,毕竟花钱买Token还是有点肉疼,所以打算在本地部一个大模型。有一台放在内网机房的服务器,用来做大模型的宿主机。有了大模型之后,需要找个终端来运行 OpenClaw 框架,所…...
从零上手Apache Zeppelin:一站式交互式数据分析平台实战
1. Apache Zeppelin初探:数据分析师的瑞士军刀 第一次接触Apache Zeppelin是在三年前的一个数据仓库迁移项目里。当时团队需要同时处理Hive、Spark和MySQL三种数据源,每天在不同终端间切换得头晕眼花。直到有位同事扔给我一个8080端口的链接:…...
Win10 + Bindiff 6.0 + IDA 7.5 环境配置与实战对比指南
1. 环境准备:Win10下的基础配置 在开始二进制分析之前,我们需要先搭建好基础环境。我推荐使用Win10 64位系统作为工作平台,因为它在兼容性和稳定性方面表现都很不错。记得关闭杀毒软件的实时防护功能,避免误报导致安装失败。我自己…...
