当前位置: 首页 > news >正文

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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

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


在这里插入图片描述


💯前言

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


💯题目描述

以下是题目原文:
P2550 [AHOI2001] 彩票摇奖
在这里插入图片描述

题目编号:P2550 [AHOI2001] 彩票摇奖

为了丰富人群的生活,支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

  1. 每张彩票上印有 7 个各不相同的号码,且这些号码的取值范围为 1~33。
  2. 每期开奖时随机摇出一个由 1~33 这 33 个自然数构成的中奖号码。
  3. 共设置 7 个奖项,特等奖——一等奖至六等奖。

中奖规则如下:

  • 特等奖: 要求彩票上 7 个号码都出现在中奖号码中。
  • 一等奖: 要求彩票上 6 个号码出现在中奖号码中。
  • 二等奖: 要求彩票上 5 个号码出现在中奖号码中。
  • 三等奖: 要求彩票上 4 个号码出现在中奖号码中。
  • 四等奖: 要求彩票上 3 个号码出现在中奖号码中。
  • 五等奖: 要求彩票上 2 个号码出现在中奖号码中。
  • 六等奖: 要求彩票上 1 个号码出现在中奖号码中。

注意:先忽略开奖号码与彩票号码中各个号码出现的顺序。例如,如果中奖号码为 23 31 11 14 19 17 18,则彩票 12 8 9 23 11 16 7 中由于其有两个号码(23 和 11)出现在中奖号码中,所以以该彩票算作五等奖。

输入格式:

  1. 输入的第一行为一个自然数 n n n,表示小明购买彩票数。
  2. 第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码。
  3. 在随后的 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. 问题解析

本题的关键是如何高效判断每张彩票和中奖号码之间的匹配程度,并据此统计各个奖项的中奖张数。

主要挑战在于:

  1. 号码匹配的效率: 如何快速比较彩票号码和中奖号码。
  2. 中奖等级的计算: 根据匹配数量归类到正确的奖项。

下面将从我的实现和老师的实现分别展开分析。


💯我的实现

以下是我的实现代码:

#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;    
}

在这里插入图片描述

实现逻辑

  1. 输入部分:

    • 使用 arr1 存储中奖号码。
    • 使用二维数组 arr2 存储每张彩票的 7 个号码。
  2. 匹配逻辑:

    • 使用双重嵌套循环对每张彩票的每个号码和中奖号码进行逐一比对。
    • 统计匹配数量 count,并根据 7 - count 更新中奖等级计数。
  3. 输出部分:

    • 按特等奖到六等奖的顺序输出中奖张数。

问题分析

  1. 效率低下:
    • 双重嵌套循环导致时间复杂度为 O ( n × 7 × 7 ) O(n \times 7 \times 7) O(n×7×7),对于较大规模输入,效率较低。
  2. 冗余判断:
    • 判断 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;
}

在这里插入图片描述

实现逻辑

  1. 输入部分:
    • 使用数组 ans 存储中奖号码。
  2. 匹配逻辑:
    • 使用嵌套循环对比彩票号码与中奖号码,统计匹配数量 cnt
    • 使用 break 提前终止内层循环,减少多余操作。
  3. 结果更新:
    • 根据 7 - cnt 更新中奖等级。

优势分析

  1. 逻辑清晰:
    • 将匹配操作和统计结果分离,代码结构简单易懂。
  2. 效率合理:
    • 使用 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;
}

在这里插入图片描述

优化效果

  1. 使用哈希表代替嵌套循环,比对效率从 O ( 7 × 7 ) O(7 \times 7) O(7×7) 降为 O ( 7 ) O(7) O(7)
  2. 改善代码可读性,增强灵活性。

💯小结

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

在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

相关文章:

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

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a; &#x1f4af;题解思路1. 问题解析 &#x1f4af;我的实现实现逻辑问题分析 &#x1f4af;老…...

并发服务器框架——zinx

zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架&#xff0c;它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能&#xff0c;包括但不限于连接管理、数据编解码、业务处理、负载均衡等&#xff0c;适用于构建各种 TCP 网络服务&#xff0c;如游戏…...

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积&#xff0c;如果大于等于0&#xff0c;则说明射线和平面没有相交&#xff0c;否则&#xff0c;说明射线和平面相交…...

浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验

一、前言&#xff1a;为什么反外挂与安全这么重要&#xff1f; 对于任何一款线上棋牌游戏而言&#xff0c;公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式&#xff0c;不仅会毁坏玩家体验&#xff0c;更会导致游戏生态崩塌、口碑下滑…...

《无力逃脱》V1.0.15.920(59069)官方中文版

艾丹是一名三臂赏金猎人&#xff0c;他必须追捕银河系中最危险、最难以捉摸的割喉者。 有些悬赏是金钱&#xff0c;有些则是有价值的信息。艾丹可以利用这些信息找到让他走上这条路的人&#xff0c;同时也会卷入一个全银河系的阴谋中。 拥有三条手臂可以让你同时对付更多的敌…...

六种主流服务器的选择与使用

网络的运行离不开各种服务器&#xff0c;它们各司其职&#xff0c;为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种&#xff1a;Web服务器 Web服务器是互联网的核心。当你打开一个网站&#xff0c;比如百度或淘宝&#xff0c;浏览器会…...

TiDB 升级至高版本提示'mysql.tidb_runaway_watch' doesn't exist 问题处理

作者&#xff1a; asd80703406 原文来源&#xff1a; https://tidb.net/blog/90394c97 背景 近期发现很多人从低版本升级至TiDB v7 或者v8版本&#xff0c;均遇到了tidb-server启动失败&#xff0c;提示报错如下&#xff1a; ["get runaway watch record failed"…...

GRU-PFG:利用图神经网络从股票因子中提取股票间相关性

“GRU-PFG: Extract Inter-Stock Correlation from Stock Factors with Graph Neural Network” 论文地址&#xff1a;https://arxiv.org/pdf/2411.18997 摘要 股票预测模型可以分为两个主要类别&#xff1a;第一类&#xff0c;例如GRU和ALSTM&#xff0c;这些模型仅基于股票…...

数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例

摘要&#xff1a; 在数字化转型的浪潮中&#xff0c;零售行业正经历着前所未有的变革。特别是在供应链管理方面&#xff0c;线上线下融合、数据孤岛、消费者需求多样化等问题日益凸显&#xff0c;对零售企业的运营效率与市场竞争力构成了严峻挑战。本文深入探讨了零售行业供应…...

安卓Activity执行finish后onNewIntent也执行了

测试反应投屏时下一集可能播放不成功。 首先看一下日志&#xff1a; onCompletion onCast handlerMessage: 2 finish: PlayerActivityabc7fdc onPause: PlayerActivityabc7fdc onNewIntent: PlayerActivityabc7fdc onResume: PlayerActivityabc7fdc onPause: PlayerActivityab…...

数据结构.期末复习.学习笔记(c语言)

《数据结构》复习概要 一、概论 二、基础1. 基本概念2. 四种逻辑结构及特点3. 算法的概念、特性4. 算法设计的4个要求 三、线性结构1.顺序表2.单链表3.循环链表双向链表4.栈&#xff08;后进先出&#xff09;5.队列&#xff08;先进先出&#xff09; 四、树和二叉树1.树2.二叉…...

Kafaka安装与启动教程

1.下载 先去官网Apache Kafka可以查看到每个版本的发布时间。选择你要安装的版本。 然后进入linux建立要存放的文件夹&#xff0c;用wget命令下载 2.安装 先解压缩&#xff1a; tar -xvzf kafka_2.12-3.5.1.tgz -C ../ 3.配置文件 修改server.properties&#xff1a; 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]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心&#xff0c;通过整合各部门业务系统数据&#xff0c;进行建模与加工&#xff0c;以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题&#xff0c;确保数据…...

【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&#xff1a;线性空间 原视频&#xff1a;【线性代数的本质】向量空间、基向量的几何解释_哔哩哔哩_bilibili 很多同学在学习线性代数的时候&#xff0c;会遇到一个困扰&#xff0c;就是不知道什么是线性空间。...

2025年贵州省职业院校技能大赛信息安全管理与评估赛项规程

贵州省职业院校技能大赛赛项规程 赛项名称&#xff1a; 信息安全管理与评估 英文名称&#xff1a; Information Security Management and Evaluation 赛项组别&#xff1a; 高职组 赛项编号&#xff1a; GZ032 1 2 一、赛项信息 赛项类别 囚每年赛 □隔年赛&#xff08;□单数年…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...