原题链接95. 费解的开关
题目难度:中等
题目来源:《算法竞赛进阶指南》
题目描述你玩过“拉灯”游戏吗?
25 盏灯排成一个 5×5 的方形。
每一个灯都有一个开关,游戏者可以改变它的状态。
每一步,游戏者可以改变某一个灯的状态。
游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。
下面这种状态
123451011101101101111000011011
在改变了最左上角的灯的状态后将变成:
123450111111101101111000011011
再改变它正中间的灯后状态将变成:
123450111111001110011010011011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。
输入格式第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。
以下若干行数据分为 n 组,每组数据有 5 行,每行 5 个字符。
每组数据描述了一个游戏的初始状态。
各组数据间用一个空行分隔。
输出格式一共输出 n 行数据,每行有...
原题链接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...
原题链接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!)$即可
我们在枚举全排列时有两种方式
第一种是依次枚举每个数放到不同的位置,即固定选择一个数,按照不同位置分类
第二种...
原题链接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$依次考虑选和不选的两种情况
这样我们就可以画一个递归树
这里我们也称之为递归搜索树,我们以三个数字为例,实际上是可以通过这种...
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是指的是依赖
目标指的是要编译的目标,也可以是一个动作,依赖可以理解为是项目的源文件
第二行指的是目标下...
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; ...
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函数的构造,实际上关于绘图...
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...