1.4k words
原题链接95. 费解的开关 题目难度:中等 题目来源:《算法竞赛进阶指南》 题目描述你玩过“拉灯”游戏吗? 25 盏灯排成一个 5×5 的方形。 每一个灯都有一个开关,游戏者可以改变它的状态。 每一步,游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。 下面这种状态 123451011101101101111000011011 在改变了最左上角的灯的状态后将变成: 123450111111101101111000011011 再改变它正中间的灯后状态将变成: 123450111111001110011010011011 给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。 输入格式第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。 以下若干行数据分为 n 组,每组数据有 5 行,每行 5 个字符。 每组数据描述了一个游戏的初始状态。 各组数据间用一个空行分隔。 输出格式一共输出 n 行数据,每行有...
627 words
原题链接717. 简单斐波那契 题目难度:中等 题目描述以下数列 0 1 1 2 3 5 8 13 21 ... 被称为斐波纳契数列。 这个数列从第 3 项开始,每一项都等于前两项之和。 输入一个整数 N,请你输出这个序列的前 N 项。 输入格式一个整数 N。 输出格式在一行中输出斐波那契数列的前 N 项,数字之间用空格隔开。 数据范围0 < N < 46 输入样例:15 输出样例:10 1 1 2 3 题目分析斐波那契数列一定要先看前两项是如何定义的,这里的前两项是0和1,对于当n大于等于3时,每一项等于前两项的和 这里其实有两种做法,一种是递归,一种是递推 用比较抽象的说法是,递归是把一类大问题分解成若干个类似的子问题,例如要求第n项的数字,只需要求第n-1和第n-2项即可,一直分解到第1项和第2项即可 递推则与之相反,是利用子问题直接计算出原问题的答案,例如同样的的求第n项的数字,我们只需要利用第1项和第2项求和计算出地3项,再利用第2项和第3项计算出第4项,直至计算出第n项 这里的代码非常好写,主要是注重理解递推与递归的含义 示例代码123456789...
844 words
原题链接94. 递归实现排列型枚举 题目难度:简单 题目描述把 $ 1 \sim n $ 这 $ n $ 个整数排成一行后随机打乱顺序,输出所有可能的次序。 输入格式一个整数 $ n $。 输出格式按照从小到大的顺序输出所有方案,每行 $ 1 $ 个。 首先,同一行相邻两个数用一个空格隔开。 其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。 数据范围$ 1 \le n \le 9 $ 输入样例:13 输出样例:1234561 2 31 3 22 1 32 3 13 1 23 2 1 题目分析这道题的意思很简单,就是生成从$ 1 \sim n $的全排列,第二个要求就是要按照字典序从小到大输出,字典序就是对于两个序列或者字符串,从头开始比较,只要相同就向后移动,不同的话就是谁小谁的字典序就小,如果都相同就是字典序相同,规定短的序列字典序较小 我们看到数据范围是到$ 9 $的,因此我们可以大致判断出这个题的时间复杂度限制在$O(n*n!)$即可 我们在枚举全排列时有两种方式 第一种是依次枚举每个数放到不同的位置,即固定选择一个数,按照不同位置分类 第二种...
853 words
原题链接92. 递归实现指数型枚举 题目难度:简单 题目描述从 $1 \sim n$ 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式输入一个整数 n。 输出格式每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。 对于没有选任何数的方案,输出空行。 本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。 数据范围$1 \le n \le 15$ 输入样例:13 输出样例:1234567322 311 31 21 2 3 题目分析这道题目的意思其实一目了然,然后我们可以根据数据范围选择出算法复杂度,实际上是$O(2^n)$级别即可 我们主要的思路就是需要确定从$1\sim n$中确定出这个数是选还是不选,因此所有的情况数就是$2^n$了 这道题的目的其实是训练我们递归的思想,对于递归(dfs)最重要的就是顺序,需要不重不漏的把所有可能的方案都顾及到,具体到这道题我们就只需要从$1\sim n$依次考虑选和不选的两种情况 这样我们就可以画一个递归树 这里我们也称之为递归搜索树,我们以三个数字为例,实际上是可以通过这种...
464 words
make/Makefilemakefile实际上是一个自动化构建项目的工具,他是对大型项目的编译工作的集成化处理,他可以处理文件的编译顺序,是否编译,以及对于代码的更复杂的操作 make是一个命令工具,大多数的ide都有这个命令,比如说Delphi的make等 make是一条命令,而makefile是一个文件,我们需要搭配使用完成项目的自动化构建 这里我们演示一下,具体的使用 123456#include<stdio.h>int main(){ printf("hello makefile\n"); return 0;} 然后我们创建一个makefile文件 内容如下 123456test: test.c gcc -o test test.c .PHONY:cleanclean: rm -f *.o test 我们依次来说说这几个命令的意思,第一个test就是会生成的目标的名称,test.c是指的是依赖 目标指的是要编译的目标,也可以是一个动作,依赖可以理解为是项目的源文件 第二行指的是目标下...
1.2k words
gcc\g++的使用这里我们需要知道gcc和g++实际上是对应的c语言和c++编译器,而其他的Java(半解释型),PHP,Python等语言实际上是解释型语言,因此我们经常能听到c语言是偏向底层的语言 我们这里就以c语言为例,进行基础的讲解 我们知道计算机只能处理二进制代码,而在计算机发展的过程中,将二进制代码是用类似打孔纸带的东西承载的,再之后发展就是由汇编语言,将众多常用的二进制代码用助记符来表示,之后再由汇编语言发展而来的各类底层语言,也就是c语言 那我们把上面的过程反过来,就是电脑能够理解我们所写代码含义的过程了,也就称之为编译 在编译的过程中实际上分为四个阶段 那我们能否将编译的过程分段查看呢,其实在Linux中是可以做到的,只需要用一些指令即可 预处理在这个阶段中,主要做一些准备工作,例如头文件展开,删除注释,条件编译,宏替换,这些工作都是在预处理阶段完成的,例如 我们首先使用vim创建一个c语言文件 1vim test.c 123456789101112#include<stdio.h>int main(){ int i = 0; ...
718 words
Matplotlib与可视化分析我们之前对数据的处理与分析,其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 1pip install matplotlib 命令来安装对应的模块 简单图形的绘制我们可以通过matplotlib的子模块pyplot来进行平面图像的绘制,比较便捷,而且输出格式也更加多样化 我们可以给他起个名字叫plt 例如 1234567891011121314import mathimport matplotlib.pyplot as pltnbSamples = 256xRange = (-math.pi, math.pi)x, y = [], []for n in range(nbSamples): ratio = (n + 0.5) / nbSamples x.append(xRange[0] + (xRange[1] - xRange[0]) * ratio) y.append(math.sin(x[-1]))plt.plot(x, y)plt.show() 结果如下 这里最复杂的其实是对x和y函数的构造,实际上关于绘图...
1.5k words
Pandas的文件读取与分析Pandas是数据分析的重要工具,因此从外部读取数据的能力是十分重要的,常用的API如图 文件类型 文件说明 读取函数 写入函数 CSV 是以纯文本形式存储的,以逗号分隔的表格数据 read_csv to_csv HDF 是一种高效存储和分发科学数据的层级数据格式 read_hdf to_hdf SQL 是一种用格式化查询语言编写的数据库查询脚本文件 read_sql to_sql JSON 一种轻量级文本数据交换格式文件 read_json to_json html 一种由超文本标记语言编写的网页文件 read_html read_html PICKLE Python内部支持的一种序列化文件 read_pickle to_pickle 利用Pandas读取文件Pandas可以读取到表格类型数据,转换成DF类型的数据,然后通过DF进行数据分析,数据预处理等操作 对于Pandas来说他的核心在于数据分析,而不是进行读写 需要注意的是,读取文件的方法配置了大量的参数,更多内容还需要阅读Pandas的官方文档 DataFr...