问题描述:
有n盏灯,编号为1~n,每个灯有个开关,按一下打开,再按一下关闭,再按一下打开。第1个人把所有灯打开,第2个人按下编号为2的倍数的灯的开关,第3个人按下编号为3的倍数的灯的开关,依此类推,一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k<=n<=1000。

  • 第一种解法

即《算法竞赛入门经典》(第2版)的方法,将灯的状态存入一维数组中,设灯亮的状态为1,第一层循环为从第1个人到第k个人,第二层循环为在所有的n盏灯中,当第i个人按i的倍数的开关时,即灯的编号取模i为0,此时灯的状态取反。根据这个思想,核心代码为:

for(int i=1;i<=k;i++)for(int j=1;j<=n;j++)if(j%i==0)a[j]=!a[j];

此种方法简单明了,比较容易理解,但这种方法在第二层循环时,对于从1到n,先判断取模,为0再对该元素取反,是对该数组每个元素进行判断操作,时间上会长一些。*那有没有更快的解法呢? *

  • 第二种解法

第1个人将灯的状态置1,在两层循环中第一层循环初始值从2开始,到第k个人; 第二层循环设变量j,变量增加为j+=i,即第m个人按开关时,不用在从1到n的数组中逐个判断该数组元素下标与m的取模,而是通过变量j+=m直接对数组元素下标是m的倍数的元素进行取反,其余元素直接忽略,在计算上会节省很多时间。可以想像的是,随着第m个人逐渐逼近k,则计算量会更加减少。核心代码如下:

for(int i=2;i<=k;i++)for(int j=i;j<=n;j+=i)a[j]=!a[j];

这种方法理解上可能稍复杂一点,但计算量及时间会减少很多,所以多一下思考,多一种解法,对于算法竞赛训练,是很有效果的。

关于开灯问题的两种解法相关推荐

  1. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  2. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  3. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  4. leetcode 73 矩阵置零 C++ 两种解法

    leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...

  5. 北林oj-算法设计与分析-Line up in the canteen(两种解法,附思路)

    描述 One day, there is a kind of new delicious food from one of the windows in the canteen. All studen ...

  6. 洛谷——P1597 语句解析(两种解法)

    P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...

  7. 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法

    Win10正式版电脑在开机或关机时都伴随着系统自带的声音.而不少用户为了让自己的windows10系统电脑变得更加个性化一些,因此都想要自己手动更改开关机音乐.这该如何操作呢?下面,小编就向大家介绍两 ...

  8. 整数拆分的两种解法(已完成)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 整数拆分 ...

  9. 嵌入式系统实验——【玄武F103开发板】顺序点亮4小灯和4小灯全亮两种点亮模式、并使用KEY1控制切换点亮模式

    一.实验目的 顺序点亮4小灯和4小灯全亮两种点亮模式.并可以使用KEY1控制切换点亮模式 二.实验思路: (一)示例程序分析 #include "stm32f10x.h" type ...

  10. 动态规划——钢筋切割问题的两种解法解析

    动态规划问题--钢筋切割问题的两种解法解析@TOC 钢筋切割问题: 对于这个问题的两种解法 先来个官方点的解法说明: 我对两种解法的个人理解 第一种解法: 这种解法就是把先钢筋分成两部分,分别记为 i ...

最新文章

  1. 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
  2. chrome取消安全模式
  3. Oracle回应用户锁定,自治数据库是更好选择
  4. HihoCoder#1509 : 异或排序(二进制)
  5. 推荐系统笔记:使用分类模型进行协同过滤
  6. fedora yum mysql_Fedora14使用yum安装mysql
  7. chart控件做实时曲线显示_Python 如何实时绘制数据
  8. unity读取Text
  9. (线段树 点更新 区间求和)lightoj1112
  10. JAVA入门级教学之(方法递归习题)
  11. 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡
  12. java中获得IP地址
  13. fortran语言和python_fortran是什么语言吗?
  14. 经典~吸引力法则:你相信什么,就会吸引什么,获得什么
  15. 计算机怎么远程桌面,电脑怎么打开远程桌面连接功能
  16. Mac 上的系统监控工具,可以实时监控系统的 CPU 使用率、内存使用率、硬盘使用、网速、电池等信息
  17. java gsoap mtom_mtom_xop 通过gsoap实现高效MTOM协议的数据传输 - 下载 - 搜珍网
  18. kcl计算机科学与技术研究生,KCL的Data Science「伦敦大学国王学院数据科学理学硕士」...
  19. 达芬奇机器人变身‘模仿达人’,通过看视频模仿手术缝合、穿针、打结等动作...
  20. k8s1.18 StorageClass 使用rbd-provisioner提供ceph rbd持久化存储

热门文章

  1. 固态硬盘与机械硬盘的区别
  2. Brotli压缩算法
  3. 我的世界饮水系统服务器,MC水瓶 - 找服玩|Minecraft服务器列表
  4. 【Python学习之七】类和对象
  5. bootstrap 动态横向时间轴_jquery纵向时间轴插件_Bootstrap响应两侧时间轴特效代码Timeline...
  6. 找个好人就嫁了吧 - 刘思伟
  7. b哩b哩视频弹幕爬虫程序(python)
  8. pl330 dmac驱动分析2----关键函数
  9. 他一定幸福地生活在那里
  10. Chrome vimium 插件