关于开灯问题的两种解法
问题描述:
有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];
这种方法理解上可能稍复杂一点,但计算量及时间会减少很多,所以多一下思考,多一种解法,对于算法竞赛训练,是很有效果的。
关于开灯问题的两种解法相关推荐
- 牛客--追债之旅 两种解法
文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- leetcode 73 矩阵置零 C++ 两种解法
leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...
- 北林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 ...
- 洛谷——P1597 语句解析(两种解法)
P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...
- 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法
Win10正式版电脑在开机或关机时都伴随着系统自带的声音.而不少用户为了让自己的windows10系统电脑变得更加个性化一些,因此都想要自己手动更改开关机音乐.这该如何操作呢?下面,小编就向大家介绍两 ...
- 整数拆分的两种解法(已完成)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 整数拆分 ...
- 嵌入式系统实验——【玄武F103开发板】顺序点亮4小灯和4小灯全亮两种点亮模式、并使用KEY1控制切换点亮模式
一.实验目的 顺序点亮4小灯和4小灯全亮两种点亮模式.并可以使用KEY1控制切换点亮模式 二.实验思路: (一)示例程序分析 #include "stm32f10x.h" type ...
- 动态规划——钢筋切割问题的两种解法解析
动态规划问题--钢筋切割问题的两种解法解析@TOC 钢筋切割问题: 对于这个问题的两种解法 先来个官方点的解法说明: 我对两种解法的个人理解 第一种解法: 这种解法就是把先钢筋分成两部分,分别记为 i ...
最新文章
- 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
- chrome取消安全模式
- Oracle回应用户锁定,自治数据库是更好选择
- HihoCoder#1509 : 异或排序(二进制)
- 推荐系统笔记:使用分类模型进行协同过滤
- fedora yum mysql_Fedora14使用yum安装mysql
- chart控件做实时曲线显示_Python 如何实时绘制数据
- unity读取Text
- (线段树 点更新 区间求和)lightoj1112
- JAVA入门级教学之(方法递归习题)
- 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡
- java中获得IP地址
- fortran语言和python_fortran是什么语言吗?
- 经典~吸引力法则:你相信什么,就会吸引什么,获得什么
- 计算机怎么远程桌面,电脑怎么打开远程桌面连接功能
- Mac 上的系统监控工具,可以实时监控系统的 CPU 使用率、内存使用率、硬盘使用、网速、电池等信息
- java gsoap mtom_mtom_xop 通过gsoap实现高效MTOM协议的数据传输 - 下载 - 搜珍网
- kcl计算机科学与技术研究生,KCL的Data Science「伦敦大学国王学院数据科学理学硕士」...
- 达芬奇机器人变身‘模仿达人’,通过看视频模仿手术缝合、穿针、打结等动作...
- k8s1.18 StorageClass 使用rbd-provisioner提供ceph rbd持久化存储