【C++】B2092 开关灯


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述和解析
    • 题目描述
    • 输入格式
    • 输出格式
    • 解析
  • 💯实现代码对比:我的做法和老师的做法
    • 我的代码实现
      • 代码分析
      • 优点
      • 问题
    • 老师的代码实现
      • 代码分析
  • 💯优化思考
    • 优点
  • 💯概念解释
  • 💯小结


在这里插入图片描述


💯前言

  • 在编程与算法学习中,想要析解一个优雅且有效的解法,基于了解题目规划与算法选择是自上考的重要步骤。本文重点分析 B2092 题目,并对不同解法进行比较和优化。通过对传统实现和优化实现的设计,带领课题中处理问题的方法和思考。
    C++ 参考手册
    在这里插入图片描述

💯题目描述和解析

B2092 开关灯
在这里插入图片描述

题目描述

假设有 N 盏灯(N 为不超过 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部处于关闭状态:

  • 第一个人(编号 1) 将所有灯打开;
  • 第二个人(编号 2) 将编号为 2 的倍数灯切换为关闭;
  • 第三个人(编号 3) 将编号为 3 的倍数灯切换为相反状态;以此类推;

最后问:当第 N 个人操作完成之后,有部分灯是关闭状态。问:这些关闭灯的编号是什么?

输入格式

一行,一个正整数 N,为灯的总量。

输出格式

一行,按顺序输出关闭灯的编号,编号与编号之间间隔一个空格。

解析

通过进一步分析可得:

  1. 灯被操作次数规则:

    • 灯编号是一个正整数,被操作的次数等于该数的因子总数(包括自身);
    • 非完全平方数因子总是偶数;完全平方数的因子数是奇数。
  2. 灯最终状态:

    • 被操作偶数次,灯为关闭状态;
    • 被操作奇数次,灯为打开状态。
  3. 解析完全平方数特性:

    • 对于每一个完全平方数,其因子数是奇数。例如,数 36 (= 6^2) 的因子为 1、2、3、6、9、18、36,共 9 个,是奇数。
    • 非完全平方数,例如 12,其因子为 1、2、3、4、6、12,共 6 个,是偶数。

因此,最终只需要找出 1 到 N 中的非完全平方数的编号。


💯实现代码对比:我的做法和老师的做法

我的代码实现

以下是我的代码:

#include <iostream>
using namespace std;const int N = 5000;
int arr[5000]; int main()
{int n = 0;cin >> n;for (int i = 1; i <= n; i++){arr[i] = 1;}if (n == 1 || n == 2 || n == 3)cout << 1 << endl;    else if (n > 3){for (int i = 1; i <= n; i++){arr[i] = 0;}for (int i = 2; i <= n; i += 2){arr[i] = 1;}for (int i = 3; i <= n; i++){for (int j = i; j <= n; j += i){if (arr[j] == 0)arr[j] = 1;elsearr[j] = 0;}}}for (int i = 1; i <= n; i++){if (arr[i] == 0)cout << i << " ";}return 0;
}

在这里插入图片描述

代码分析

  1. 初始化数组:

    • 使用 arr[i] 表示灯的状态,1 表示关闭,0 表示打开。
    • 初始化为全关闭状态。
  2. 状态切换逻辑:

    • 第一轮操作将所有灯置为打开。
    • 第二轮操作将所有偶数编号的灯关闭。
    • 从第三轮开始,依次对编号为当前轮数倍数的灯进行状态切换。
  3. 最终输出:

    • 遍历数组,输出状态为关闭的灯编号。

优点

  • 直观地模拟题目中每一轮的状态切换。
  • 代码逻辑清晰易懂。

问题

  • 时间复杂度较高,为 O ( N 2 ) O(N^2) O(N2)
  • 初始化和部分操作存在冗余。

老师的代码实现

以下是老师提供的代码:

#include <iostream>
#include <cstring>
using namespace std;const int N = 5010;
char arr[N]; // 下标为0的位置不使用int main()
{int n = 0;cin >> n;int i = 0;// 第一人将所有灯关闭,因为数组开始全是0,直接跳过操作for (i = 2; i <= n; i++){for (int j = i; j <= n; j++){if (j % i == 0){if (arr[j] == 1)arr[j] = 0;elsearr[j] = 1;}}}for (i = 1; i <= n; i++){if (arr[i] == 0)cout << i << " ";}cout << endl;return 0;
}

在这里插入图片描述

代码分析

  1. 状态切换逻辑:

    • 外层循环控制第几轮操作;
    • 内层循环处理当前人的操作范围(倍数灯)。
  2. 优化建议:

    • 条件 if (j % i == 0) 可以去掉,直接跳步循环 j += i
    • 状态切换 if (arr[j] == 1) 部分可以替换为 arr[j] = !arr[j];

💯优化思考

基于完全平方数的性质,可以直接优化代码,只需输出 1 到 $ \sqrt{N} $ 的平方数:

#include <iostream>
#include <cmath>
using namespace std;int main() {int n;cin >> n;for (int i = 1; i * i <= n; i++) {cout << i * i;if ((i + 1) * (i + 1) <= n) cout << " ";}return 0;
}

在这里插入图片描述

优点

  1. 时间复杂度:

    • 原代码复杂度为 O ( N 2 ) O(N^2) O(N2),优化后为 O ( N ) O(\sqrt{N}) O(N )
  2. 空间复杂度:

    • 无需数组存储状态,优化为 O ( 1 ) O(1) O(1)

💯概念解释

  1. 因子与完全平方数:

    • 因子的总数决定了灯被操作的次数。
    • 非完全平方数因子总数为偶数,完全平方数因子总数为奇数。
  2. 逻辑非运算:

    • 运算符 ! 表示取反:!0 = 1!1 = 0

💯小结

本文通过对 B2092 题目的多种实现方式进行分析与优化,从模拟实现到基于数学规律的优化,展示了从直观思考到高效解法的演进过程。希望读者通过本文的讲解,能够更加深入地理解问题的本质,并在实际编程中应用类似的优化思路。


在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502092.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PS不常见教程】实操篇之通道抠图-抠黑色背景的图片

观前小提示&#xff1a;本文内容为我原创成果&#xff0c;若您需要转载或引用其中图片或文字内容&#xff0c;请记得标注来源是“璞子的家”哦&#xff0c;感谢您的尊重&#xff0c;理解与支持&#xff0c;谢谢啦&#xff01; 如果没看过之前的文章&#xff0c;可以先看之前的两…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

【Cesium】三、实现开场动画效果

文章目录 实现效果实现方法实现代码组件化 实现效果 实现方法 Cesium官方提供了Camera的flyTo方法实现了飞向目的地的动画效果。 官方API&#xff1a;传送门 这里只需要用到目的地&#xff08;destination&#xff09;和持续时间&#xff08;duration&#xff09;这两个参数…

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近&#xff0c;DeepSeek v3&#xff08;一个MoE模型&#xff0c;拥有671B参数&#xff0c;其中37B参数被激活&#xff09;模型全球爆火。 作为一款能与Claude 3.5 Sonnet&#xff0c;GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源&#xff0c;还放出一份扎实的技术…

Kbuild学习知识点

1.Kbuild本质&#xff1a;一个可扩展、可配置的Makefile框架&#xff0c;递归式Makefile&#xff0c;菜单式配置。 2.Kbuild构成&#xff1a; Makefile:顶层目录下的Makefile.config:内核的配置文件arch/S(ARCH)/Makefile:跟平台架构相关的Makefilescripts/Makefile.*:通用编…

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

后端java开发路由接口并部署服务器(四)

一、安装IntelliJ IDEA&#xff0c;安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA&#xff0c;输入网盘资源文件内容 三、汉化处理 插件搜索chinese&#xff0c;就会找到相应的插件安装重启软件即可 四、新建后端j…

一文理解ssh,ssl协议以及应用

在使用基于密钥的认证方式的时候&#xff0c;私钥的位置一定要符合远程服务器规定的位置&#xff0c;否则找不到私钥的位置会导致建立ssh连接失败 SSH 全称是 “Secure Shell”&#xff0c;即安全外壳协议。 它是一种网络协议&#xff0c;用于在不安全的网络中安全地进行远程登…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…

FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法

板卡选择困难症了&#xff1f;如果你也想玩FPGA、STM32、ESP32、RP2040相关的板卡&#xff0c;不如看看以下几款板卡&#xff0c;如果正巧碰上能实现你想要做的项目呢~ 01 小脚丫FPGA STEP BaseBoard V4.0套件 STEP BaseBoard V4.0是第4代小脚丫FPGA扩展底板&#xff08;点击了…

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹&#xff0c;输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级

注&#xff1a;本文为 “HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级” 相关文章合辑。 引文图片 csdn 转储异常&#xff0c;重传。 篇 1&#xff1a;Smart-Baby 回复中给出故障现象判断参考 篇 2、篇3 &#xff1a;HP 官方 BIOS 恢复、升级教程 开机黑屏&#xff0c…

代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础

图论基础 1、图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 2、图的种类 整体上一般分为有向图和无向图&#xff1b; 有向图是指图中边是有方向的…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中&#xff0c;弱指针&#xff08;TWeakPtr &#xff09;也是一种智能指针类型&#xff0c;主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下&#xff0c;提供一种可…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例&#xff0c;Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持&#xff0c;开发者只需在应用中添加相关依赖并配置必要的属性&#xff0c;Spring Boot 会自动配置所需的连…