算法
文章平均质量分 59
FantasticGold
这个作者很懒,什么都没留下…
展开
-
算法:随机数
随机数思路1在C++中,生成随机数的函数为rand(),返回一个不大于RAND_MAX的非负数。但是,如果生成随机数的种子和生成的次数相同,那么生成的随机数相同,因此rand()只能生成伪随机数。为了尽量得到真随机数,每次应该取不同的种子,由于time(NULL)返回从1970.1.1/00:00到现在的秒数,可以采用srand(time(NULL))。因为程序运行非常快,两次取随机数的间隔可...原创 2018-10-12 18:52:19 · 658 阅读 · 0 评论 -
算法:Binary Search
在做编程题的时候,我们要考虑算法的时间复杂度和空间复杂度,为了降低时间复杂度,我们经常用二分法将线性复杂度降为对数复杂度,那么现在我来总结一下二分查找。二分查找思路当需要从线性数组查找时,我们可以遍历数组,时间复杂度为O(n)。但如果数组是有序的,那么我们可以先将数组中间的元素与待查找的元素比较,根据比较结果从数组的前半部分或者后半部分继续查找,这样显然要比逐个查找快多了。在最坏情...原创 2018-02-23 21:28:22 · 344 阅读 · 0 评论 -
算法:State Compression
上周参加了学校的acm比赛,只做出两道水题,看了答案发现其中有两道题用到了状态压缩,于是就去学习了一波。状态压缩状态压缩就是将题目的模型抽象成状态的集合,如果每个对象只有两个状态且对象数量较少,可以用0和1分别代表这两种状态,用一个二进制数可以表示所有对象的状态,其中位数等于对象的个数。状态压缩往往与动态规划联系起来,下面以LeetCode的一道题作为例子。Can I Win...原创 2018-04-04 20:00:54 · 235 阅读 · 0 评论 -
算法:Sliding Window
上周末终于有空参加LeetCode的比赛了,而且这还是我第一次在比赛中完成所有的题目。虽然加上罚时超了比赛时间,但和以前相比也算是很大的进步。这次的题目比较简单,前两道就是暴力解法,第三道是动态规划的简单应用,最后一道比较有意思,我一开始超时了,后来发现可以用滑动窗口的思想优化。滑动窗口即Sliding Window,其实我不确定滑动窗口是不是一个算法,因为我在书上并没有看到过这个算法的介绍,但滑...原创 2018-03-14 00:36:16 · 853 阅读 · 0 评论 -
算法:最大公约数
很快ACM校集训队要选拔了,想学一波算法,顺便记下模板。最大公约数功能输入两个数a和b,输出a和b的最大公约数.最大公约数: 1. 既可以整除a,也可以整除b的数,组成集合C 2. 集合C中的最大元素,即最大公约数思路辗转相除法: 1. 用a和b中较大值max除以较小值min 2. 若整除,则结果为min 3. 若不整除,则令a和b分别等于min和余数mod,递归...原创 2018-06-01 22:40:15 · 1531 阅读 · 0 评论 -
算法:模拟退火
之前觉得模拟退火算法是很高大上的存在,一直没有去了解。然后上次数模校赛我们就用到了模拟退火算法,发现思路其实并不复杂。模拟退火算法模拟退火(Simulated Annealing),来源于热力学上的退火现象。退火现象就是,将固体加温再徐徐冷却,最后在常温时就会呈现晶体状态。从微观角度来看,固体加温时,内部粒子趋于无序,内能增大;徐徐冷却时,粒子趋于有序,内能减小,在每个温度都达到平衡态;最...原创 2018-06-05 01:22:44 · 411 阅读 · 0 评论 -
算法:大数加法
对于无法用int类型甚至long long int类型表示的大整数,可以用数组来存储,那么大数的运算就需要手动实现。大数加法功能输入两个大数a和b,输出a+b。思路从低位到高位逐位相加,并记录进位,若最高位有进位,则位数加1。必须保证a和b的最高位之前为0,这样在相加时无需根据a和b的位数分类讨论。时间复杂度O(n)模板const int B = 1...原创 2018-07-01 01:33:04 · 400 阅读 · 0 评论 -
算法:线性筛质数
线性筛质数功能输出从000到100000010000001000000的所有质数。思路首先000和111不是质数,从222开始逐个判断是否为质数。如果ttt为质数,那么对于任意正整数kkk,k×tk×tk \times t不是质数,因此可以将k×tk×tk \times t筛去。如果ttt已经被筛去,那么ttt不是质数,但仍然要将k×tk×tk \times t筛去。为了避免重复筛...原创 2018-07-07 10:55:13 · 491 阅读 · 0 评论 -
算法:快速幂
快速幂功能快速计算ababa^b思路若将bbb表示为∑pi×2i∑pi×2i\sum p_i \times 2^i,则ababa^b可以表示为∏(a2i)pi∏(a2i)pi\prod (a^{2^i})^{p_i},其中pipip_i表示bbb的二进制从右往左第iii位数字。时间复杂度O(logn)O(logn)O(\log n)测试HDU:1061模板...原创 2018-08-16 10:35:33 · 187 阅读 · 0 评论 -
算法:快速输入输出
快速输入输出功能对于大量数据进行快速输入输出。思路利用getchar()代替scanf()输入整数,利用putchar()代替printf()输出整数。模板非负整数输入/** * @param x: the input number * @other: x >= 0; */void FR(int& x) { x = 0; char...原创 2018-08-17 20:48:27 · 2806 阅读 · 0 评论 -
算法:矩阵快速幂
矩阵快速幂功能快速计算矩阵AAA的bbb次方幂思路将快速幂算法中的乘法运算替换为矩阵乘法。若将bbb表示为∑pi×2i∑pi×2i\sum p_i \times 2_i,则AbAbA^b可以表示为∏(A2i)pi∏(A2i)pi\prod (A^{2^i})^{p_i},其中pipip_i表示bbb的二进制从右往左第iii位数字。时间复杂度O(logn)O(logn)O(...原创 2018-08-17 22:15:21 · 342 阅读 · 0 评论 -
算法:逆元
逆元定义一个数aaa的倒数a−1a^{-1}a−1满足a×a−1=1a \times a^{-1} = 1a×a−1=1。取aaa的逆元(amod  b)−1(a \mod b)^{-1}(amodb)−1满足(amod  b)×(原创 2018-09-27 00:37:46 · 265 阅读 · 0 评论 -
算法:拓扑排序
拓扑排序定义将一个有向无环图的所有顶点排成一个线性序列,满足所有单向边都由序号小的顶点指向序号大的顶点,这就是拓扑排序。思路计算所有顶点的入度,将入度为000的顶点排在前面,即序号较小的位置,然后删去这些顶点以及连接的边,再从剩下的顶点中选取入度为000的顶点排序,不断循环直到所有顶点均分配好序号。因为当顶点被分配序号时入度为000,即所有指向该顶点的边均来自序号更小的顶点,所以按序号形成...原创 2018-10-08 00:41:12 · 346 阅读 · 0 评论 -
算法:数位DP
数位DP问题求区间[L,R][L, R][L,R]中满足条件的数有多少个, 0≤L≤R0 \le L \le R0≤L≤R,该条件与数位有关,比如不包含数字444。思路时间复杂度O(logn)O(\log n)O(logn)。实际上为nnn的位数,而nnn的位数可以表示为lgn\lg nlgn,即lognlog10\frac {\log n}{\log 10}log10logn...原创 2018-10-12 14:16:49 · 284 阅读 · 0 评论 -
算法:Dynamic Programming
今天在LeetCode做了一道动态规划的题,一直觉得动态规划的解题思路很有意思,借这道题来总结一下。动态规划我最初搞不懂动态规划是什么,那时候懂贪心算法,觉得贪心算法就是在求解问题的每一步都取全局最优,而动态规划在求解问题的每一步都取局部最优。后来做了一些动态规划的题才发现自己早就接触过了,还记得一道很经典的求从起点到终点有多少种走法的题就用了动态规划的思想。现在看来,动态规划就是缩小...原创 2018-02-13 19:04:31 · 225 阅读 · 0 评论